[MPLUGIN-189] commit some stuff on annotation scanning
git-svn-id: https://svn.apache.org/repos/asf/maven/plugin-tools/branches/MPLUGIN-189@1333835 13f79535-47bb-0310-9956-ffa450edef68master
parent
8c108af423
commit
7e10f5b09f
|
|
@ -11,4 +11,44 @@
|
||||||
|
|
||||||
<name>Maven Plugin Tools Annotations</name>
|
<name>Maven Plugin Tools Annotations</name>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
|
||||||
|
<!-- maven -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.maven</groupId>
|
||||||
|
<artifactId>maven-project</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.maven</groupId>
|
||||||
|
<artifactId>maven-model</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.maven</groupId>
|
||||||
|
<artifactId>maven-plugin-descriptor</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.maven.plugin-tools</groupId>
|
||||||
|
<artifactId>maven-plugin-tools-api</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.codehaus.plexus</groupId>
|
||||||
|
<artifactId>plexus-utils</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.codehaus.plexus</groupId>
|
||||||
|
<artifactId>plexus-container-default</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>asm</groupId>
|
||||||
|
<artifactId>asm</artifactId>
|
||||||
|
<version>3.3.1</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>asm</groupId>
|
||||||
|
<artifactId>asm-commons</artifactId>
|
||||||
|
<version>3.3.1</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,61 @@
|
||||||
|
package org.apache.maven.tools.plugin.annotations;
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import org.apache.maven.artifact.DependencyResolutionRequiredException;
|
||||||
|
import org.apache.maven.plugin.descriptor.InvalidPluginDescriptorException;
|
||||||
|
import org.apache.maven.plugin.descriptor.MojoDescriptor;
|
||||||
|
import org.apache.maven.plugin.descriptor.PluginDescriptor;
|
||||||
|
import org.apache.maven.project.MavenProject;
|
||||||
|
import org.apache.maven.tools.plugin.DefaultPluginToolsRequest;
|
||||||
|
import org.apache.maven.tools.plugin.PluginToolsRequest;
|
||||||
|
import org.apache.maven.tools.plugin.extractor.ExtractionException;
|
||||||
|
import org.apache.maven.tools.plugin.extractor.MojoDescriptorExtractor;
|
||||||
|
import org.codehaus.plexus.logging.AbstractLogEnabled;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Olivier Lamy
|
||||||
|
*/
|
||||||
|
public class JavaAnnotationsMojoDescriptorExtractor
|
||||||
|
extends AbstractLogEnabled
|
||||||
|
implements MojoDescriptorExtractor
|
||||||
|
{
|
||||||
|
|
||||||
|
public List<MojoDescriptor> execute( MavenProject project, PluginDescriptor pluginDescriptor )
|
||||||
|
throws ExtractionException, InvalidPluginDescriptorException
|
||||||
|
{
|
||||||
|
return execute( new DefaultPluginToolsRequest( project, pluginDescriptor ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<MojoDescriptor> execute( PluginToolsRequest request )
|
||||||
|
throws ExtractionException, InvalidPluginDescriptorException
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
List<String> classpathElements = request.getProject().getCompileClasspathElements();
|
||||||
|
return null; //To change body of implemented methods use File | Settings | File Templates.
|
||||||
|
}
|
||||||
|
catch ( DependencyResolutionRequiredException e )
|
||||||
|
{
|
||||||
|
throw new ExtractionException( e.getMessage(), e );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,52 @@
|
||||||
|
package org.apache.maven.tools.plugin.annotations.scanner;
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Olivier Lamy
|
||||||
|
*/
|
||||||
|
public class AnnotatedField
|
||||||
|
{
|
||||||
|
private String fieldName;
|
||||||
|
|
||||||
|
public AnnotatedField( String fieldName )
|
||||||
|
{
|
||||||
|
this.fieldName = fieldName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getFieldName()
|
||||||
|
{
|
||||||
|
return fieldName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFieldName( String name )
|
||||||
|
{
|
||||||
|
this.fieldName = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString()
|
||||||
|
{
|
||||||
|
final StringBuilder sb = new StringBuilder();
|
||||||
|
sb.append( "AnnotatedField" );
|
||||||
|
sb.append( "{fieldName='" ).append( fieldName ).append( '\'' );
|
||||||
|
sb.append( '}' );
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,84 @@
|
||||||
|
package org.apache.maven.tools.plugin.annotations.scanner;
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import org.apache.maven.tools.plugin.annotations.Component;
|
||||||
|
|
||||||
|
import java.lang.annotation.Annotation;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Olivier Lamy
|
||||||
|
*/
|
||||||
|
public class ComponentAnnotationContent
|
||||||
|
extends AnnotatedField
|
||||||
|
implements Component
|
||||||
|
{
|
||||||
|
private String role;
|
||||||
|
|
||||||
|
private String roleHint;
|
||||||
|
|
||||||
|
public ComponentAnnotationContent( String fieldName )
|
||||||
|
{
|
||||||
|
super( fieldName );
|
||||||
|
}
|
||||||
|
|
||||||
|
public ComponentAnnotationContent( String fieldName, String role, String roleHint )
|
||||||
|
{
|
||||||
|
this( fieldName );
|
||||||
|
this.role = role;
|
||||||
|
this.roleHint = roleHint;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String role()
|
||||||
|
{
|
||||||
|
return role;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void role( String role )
|
||||||
|
{
|
||||||
|
this.role = role;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String roleHint()
|
||||||
|
{
|
||||||
|
return roleHint;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void roleHint( String roleHint )
|
||||||
|
{
|
||||||
|
this.roleHint = roleHint;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Class<? extends Annotation> annotationType()
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString()
|
||||||
|
{
|
||||||
|
final StringBuilder sb = new StringBuilder();
|
||||||
|
sb.append( super.toString() );
|
||||||
|
sb.append( "ComponentAnnotationContent" );
|
||||||
|
sb.append( "{role='" ).append( role ).append( '\'' );
|
||||||
|
sb.append( ", roleHint='" ).append( roleHint ).append( '\'' );
|
||||||
|
sb.append( '}' );
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,204 @@
|
||||||
|
package org.apache.maven.tools.plugin.annotations.scanner;
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import org.apache.maven.tools.plugin.annotations.Component;
|
||||||
|
import org.apache.maven.tools.plugin.annotations.Execute;
|
||||||
|
import org.apache.maven.tools.plugin.annotations.Mojo;
|
||||||
|
import org.apache.maven.tools.plugin.annotations.Parameter;
|
||||||
|
import org.apache.maven.tools.plugin.extractor.ExtractionException;
|
||||||
|
import org.codehaus.plexus.logging.AbstractLogEnabled;
|
||||||
|
import org.codehaus.plexus.util.DirectoryScanner;
|
||||||
|
import org.codehaus.plexus.util.IOUtil;
|
||||||
|
import org.codehaus.plexus.util.reflection.Reflector;
|
||||||
|
import org.objectweb.asm.ClassReader;
|
||||||
|
|
||||||
|
import java.io.BufferedInputStream;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Olivier Lamy
|
||||||
|
*/
|
||||||
|
public class DefaultMojoAnnotationsScanner
|
||||||
|
extends AbstractLogEnabled
|
||||||
|
implements MojoAnnotationsScanner
|
||||||
|
{
|
||||||
|
private Reflector reflector = new Reflector();
|
||||||
|
|
||||||
|
public List<MojoAnnotatedClass> scan( MojoAnnotationsScannerRequest request )
|
||||||
|
throws ExtractionException
|
||||||
|
{
|
||||||
|
List<MojoAnnotatedClass> mojoAnnotatedClasses = new ArrayList<MojoAnnotatedClass>();
|
||||||
|
try
|
||||||
|
{
|
||||||
|
for ( File classDirectory : request.getClassesDirectories() )
|
||||||
|
{
|
||||||
|
mojoAnnotatedClasses.addAll( scanDirectory( classDirectory, request.getIncludePatterns() ) );
|
||||||
|
}
|
||||||
|
return mojoAnnotatedClasses;
|
||||||
|
}
|
||||||
|
catch ( IOException e )
|
||||||
|
{
|
||||||
|
throw new ExtractionException( e.getMessage(), e );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected List<MojoAnnotatedClass> scanDirectory( File classDirectory, List<String> includePatterns )
|
||||||
|
throws IOException, ExtractionException
|
||||||
|
{
|
||||||
|
List<MojoAnnotatedClass> mojoAnnotatedClasses = new ArrayList<MojoAnnotatedClass>();
|
||||||
|
DirectoryScanner scanner = new DirectoryScanner();
|
||||||
|
scanner.setBasedir( classDirectory );
|
||||||
|
scanner.addDefaultExcludes();
|
||||||
|
if ( includePatterns != null )
|
||||||
|
{
|
||||||
|
scanner.setIncludes( includePatterns.toArray( new String[includePatterns.size()] ) );
|
||||||
|
}
|
||||||
|
scanner.scan();
|
||||||
|
String[] classFiles = scanner.getIncludedFiles();
|
||||||
|
|
||||||
|
for ( String classFile : classFiles )
|
||||||
|
{
|
||||||
|
InputStream is = new BufferedInputStream( new FileInputStream( new File( classDirectory, classFile ) ) );
|
||||||
|
try
|
||||||
|
{
|
||||||
|
|
||||||
|
if ( classFile.endsWith( ".class" ) )
|
||||||
|
{
|
||||||
|
MojoClassVisitor mojoClassVisitor = new MojoClassVisitor( getLogger() );
|
||||||
|
ClassReader rdr = new ClassReader( is );
|
||||||
|
rdr.accept( mojoClassVisitor,
|
||||||
|
ClassReader.SKIP_FRAMES | ClassReader.SKIP_CODE | ClassReader.SKIP_DEBUG );
|
||||||
|
analyzeVisitors( mojoClassVisitor );
|
||||||
|
if ( isMojoAnnnotatedClassCandidate( mojoClassVisitor.getMojoAnnotatedClass() ) != null )
|
||||||
|
{
|
||||||
|
mojoAnnotatedClasses.add( mojoClassVisitor.getMojoAnnotatedClass() );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
IOUtil.close( is );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return mojoAnnotatedClasses;
|
||||||
|
}
|
||||||
|
|
||||||
|
private MojoAnnotatedClass isMojoAnnnotatedClassCandidate( MojoAnnotatedClass mojoAnnotatedClass )
|
||||||
|
{
|
||||||
|
if ( mojoAnnotatedClass == null )
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if ( !mojoAnnotatedClass.getComponents().isEmpty() || !mojoAnnotatedClass.getParameters().isEmpty()
|
||||||
|
|| mojoAnnotatedClass.getExecute() != null || mojoAnnotatedClass.getMojo() != null )
|
||||||
|
{
|
||||||
|
return mojoAnnotatedClass;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void analyzeVisitors( MojoClassVisitor mojoClassVisitor )
|
||||||
|
throws ExtractionException
|
||||||
|
{
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
MojoClassVisitor.MojoAnnotationVisitor mojoAnnotationVisitor =
|
||||||
|
mojoClassVisitor.getAnnotationVisitorMap().get( Mojo.class.getName() );
|
||||||
|
if ( mojoAnnotationVisitor != null )
|
||||||
|
{
|
||||||
|
MojoClassVisitor.MojoAnnotationContent mojoAnnotationContent =
|
||||||
|
new MojoClassVisitor.MojoAnnotationContent();
|
||||||
|
Class clazz = Thread.currentThread().getContextClassLoader().loadClass(
|
||||||
|
MojoClassVisitor.MojoAnnotationContent.class.getName() );
|
||||||
|
for ( Map.Entry<String, Object> entry : mojoAnnotationVisitor.getAnnotationValues().entrySet() )
|
||||||
|
{
|
||||||
|
reflector.invoke( mojoAnnotationContent, entry.getKey(), new Object[]{ entry.getValue() } );
|
||||||
|
}
|
||||||
|
mojoClassVisitor.getMojoAnnotatedClass().setMojo( mojoAnnotationContent );
|
||||||
|
}
|
||||||
|
|
||||||
|
mojoAnnotationVisitor = mojoClassVisitor.getAnnotationVisitorMap().get( Execute.class.getName() );
|
||||||
|
if ( mojoAnnotationVisitor != null )
|
||||||
|
{
|
||||||
|
MojoClassVisitor.ExecuteAnnotationContent executeAnnotationContent =
|
||||||
|
new MojoClassVisitor.ExecuteAnnotationContent();
|
||||||
|
Class clazz = Thread.currentThread().getContextClassLoader().loadClass(
|
||||||
|
MojoClassVisitor.MojoAnnotationContent.class.getName() );
|
||||||
|
for ( Map.Entry<String, Object> entry : mojoAnnotationVisitor.getAnnotationValues().entrySet() )
|
||||||
|
{
|
||||||
|
reflector.invoke( executeAnnotationContent, entry.getKey(), new Object[]{ entry.getValue() } );
|
||||||
|
}
|
||||||
|
mojoClassVisitor.getMojoAnnotatedClass().setExecute( executeAnnotationContent );
|
||||||
|
}
|
||||||
|
|
||||||
|
List<MojoClassVisitor.MojoFieldVisitor> mojoFieldVisitors =
|
||||||
|
mojoClassVisitor.findFieldWithAnnotationClass( Parameter.class.getName() );
|
||||||
|
|
||||||
|
for ( MojoClassVisitor.MojoFieldVisitor mojoFieldVisitor : mojoFieldVisitors )
|
||||||
|
{
|
||||||
|
ParameterAnnotationContent parameterAnnotationContent =
|
||||||
|
new ParameterAnnotationContent( mojoFieldVisitor.getFieldName() );
|
||||||
|
if ( mojoFieldVisitor.getMojoAnnotationVisitor() != null )
|
||||||
|
{
|
||||||
|
for ( Map.Entry<String, Object> entry : mojoFieldVisitor.getMojoAnnotationVisitor().getAnnotationValues().entrySet() )
|
||||||
|
{
|
||||||
|
reflector.invoke( parameterAnnotationContent, entry.getKey(),
|
||||||
|
new Object[]{ entry.getValue() } );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
mojoClassVisitor.getMojoAnnotatedClass().getParameters().add( parameterAnnotationContent );
|
||||||
|
}
|
||||||
|
|
||||||
|
mojoFieldVisitors = mojoClassVisitor.findFieldWithAnnotationClass( Component.class.getName() );
|
||||||
|
|
||||||
|
for ( MojoClassVisitor.MojoFieldVisitor mojoFieldVisitor : mojoFieldVisitors )
|
||||||
|
{
|
||||||
|
ComponentAnnotationContent componentAnnotationContent =
|
||||||
|
new ComponentAnnotationContent( mojoFieldVisitor.getFieldName() );
|
||||||
|
|
||||||
|
if ( mojoFieldVisitor.getMojoAnnotationVisitor() != null )
|
||||||
|
{
|
||||||
|
for ( Map.Entry<String, Object> entry : mojoFieldVisitor.getMojoAnnotationVisitor().getAnnotationValues().entrySet() )
|
||||||
|
{
|
||||||
|
reflector.invoke( componentAnnotationContent, entry.getKey(),
|
||||||
|
new Object[]{ entry.getValue() } );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
mojoClassVisitor.getMojoAnnotatedClass().getComponents().add( componentAnnotationContent );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
catch ( Exception e )
|
||||||
|
{
|
||||||
|
throw new ExtractionException( e.getMessage(), e );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,138 @@
|
||||||
|
package org.apache.maven.tools.plugin.annotations.scanner;
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import org.apache.maven.tools.plugin.annotations.Execute;
|
||||||
|
import org.apache.maven.tools.plugin.annotations.Mojo;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Olivier Lamy
|
||||||
|
*/
|
||||||
|
public class MojoAnnotatedClass
|
||||||
|
{
|
||||||
|
private String className;
|
||||||
|
|
||||||
|
private String parentClassName;
|
||||||
|
|
||||||
|
private Mojo mojo;
|
||||||
|
|
||||||
|
private Execute execute;
|
||||||
|
|
||||||
|
private List<ParameterAnnotationContent> parameters;
|
||||||
|
|
||||||
|
private List<ComponentAnnotationContent> components;
|
||||||
|
|
||||||
|
public MojoAnnotatedClass()
|
||||||
|
{
|
||||||
|
// no op
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getClassName()
|
||||||
|
{
|
||||||
|
return className;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MojoAnnotatedClass setClassName( String className )
|
||||||
|
{
|
||||||
|
this.className = className;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Mojo getMojo()
|
||||||
|
{
|
||||||
|
return mojo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MojoAnnotatedClass setMojo( Mojo mojo )
|
||||||
|
{
|
||||||
|
this.mojo = mojo;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Execute getExecute()
|
||||||
|
{
|
||||||
|
return execute;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MojoAnnotatedClass setExecute( Execute execute )
|
||||||
|
{
|
||||||
|
this.execute = execute;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ParameterAnnotationContent> getParameters()
|
||||||
|
{
|
||||||
|
if ( this.parameters == null )
|
||||||
|
{
|
||||||
|
this.parameters = new ArrayList<ParameterAnnotationContent>();
|
||||||
|
}
|
||||||
|
return parameters;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MojoAnnotatedClass setParameters( List<ParameterAnnotationContent> parameters )
|
||||||
|
{
|
||||||
|
this.parameters = parameters;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ComponentAnnotationContent> getComponents()
|
||||||
|
{
|
||||||
|
if ( this.components == null )
|
||||||
|
{
|
||||||
|
this.components = new ArrayList<ComponentAnnotationContent>();
|
||||||
|
}
|
||||||
|
return components;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MojoAnnotatedClass setComponents( List<ComponentAnnotationContent> components )
|
||||||
|
{
|
||||||
|
this.components = components;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getParentClassName()
|
||||||
|
{
|
||||||
|
return parentClassName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MojoAnnotatedClass setParentClassName( String parentClassName )
|
||||||
|
{
|
||||||
|
this.parentClassName = parentClassName;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString()
|
||||||
|
{
|
||||||
|
final StringBuilder sb = new StringBuilder();
|
||||||
|
sb.append( "MojoAnnotatedClass" );
|
||||||
|
sb.append( "{className='" ).append( className ).append( '\'' );
|
||||||
|
sb.append( ", parentClassName='" ).append( parentClassName ).append( '\'' );
|
||||||
|
sb.append( ", mojo=" ).append( mojo );
|
||||||
|
sb.append( ", execute=" ).append( execute );
|
||||||
|
sb.append( ", parameters=" ).append( parameters );
|
||||||
|
sb.append( ", components=" ).append( components );
|
||||||
|
sb.append( '}' );
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,45 @@
|
||||||
|
package org.apache.maven.tools.plugin.annotations.scanner;
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import org.apache.maven.tools.plugin.annotations.Component;
|
||||||
|
import org.apache.maven.tools.plugin.annotations.Execute;
|
||||||
|
import org.apache.maven.tools.plugin.annotations.Mojo;
|
||||||
|
import org.apache.maven.tools.plugin.annotations.Parameter;
|
||||||
|
import org.apache.maven.tools.plugin.extractor.ExtractionException;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Olivier Lamy
|
||||||
|
*/
|
||||||
|
public interface MojoAnnotationsScanner
|
||||||
|
{
|
||||||
|
String ROLE = MojoAnnotationsScanner.class.getName();
|
||||||
|
|
||||||
|
static final List<String> acceptedClassLevelAnnotationClasses =
|
||||||
|
Arrays.asList( Mojo.class.getName(), Execute.class.getName() );
|
||||||
|
|
||||||
|
static final List<String> acceptedFieldLevelAnnotationClasses =
|
||||||
|
Arrays.asList( Parameter.class.getName(), Component.class.getName() );
|
||||||
|
|
||||||
|
List<MojoAnnotatedClass> scan( MojoAnnotationsScannerRequest request )
|
||||||
|
throws ExtractionException;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,71 @@
|
||||||
|
package org.apache.maven.tools.plugin.annotations.scanner;
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Olivier Lamy
|
||||||
|
*/
|
||||||
|
public class MojoAnnotationsScannerRequest
|
||||||
|
{
|
||||||
|
private List<File> classesDirectories = new ArrayList<File>();
|
||||||
|
|
||||||
|
private List<File> dependencies = new ArrayList<File>();
|
||||||
|
|
||||||
|
private List<String> includePatterns = Arrays.asList( "**/*.class" );
|
||||||
|
|
||||||
|
public MojoAnnotationsScannerRequest()
|
||||||
|
{
|
||||||
|
// no o
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<File> getClassesDirectories()
|
||||||
|
{
|
||||||
|
return classesDirectories;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setClassesDirectories( List<File> classesDirectories )
|
||||||
|
{
|
||||||
|
this.classesDirectories = classesDirectories;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<File> getDependencies()
|
||||||
|
{
|
||||||
|
return dependencies;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDependencies( List<File> dependencies )
|
||||||
|
{
|
||||||
|
this.dependencies = dependencies;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<String> getIncludePatterns()
|
||||||
|
{
|
||||||
|
return includePatterns;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setIncludePatterns( List<String> includePatterns )
|
||||||
|
{
|
||||||
|
this.includePatterns = includePatterns;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,524 @@
|
||||||
|
package org.apache.maven.tools.plugin.annotations.scanner;
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import org.apache.maven.tools.plugin.annotations.Execute;
|
||||||
|
import org.apache.maven.tools.plugin.annotations.LifecyclePhase;
|
||||||
|
import org.apache.maven.tools.plugin.annotations.Mojo;
|
||||||
|
import org.codehaus.plexus.logging.Logger;
|
||||||
|
import org.codehaus.plexus.util.StringUtils;
|
||||||
|
import org.objectweb.asm.AnnotationVisitor;
|
||||||
|
import org.objectweb.asm.Attribute;
|
||||||
|
import org.objectweb.asm.ClassVisitor;
|
||||||
|
import org.objectweb.asm.FieldVisitor;
|
||||||
|
import org.objectweb.asm.MethodVisitor;
|
||||||
|
import org.objectweb.asm.Type;
|
||||||
|
|
||||||
|
import java.lang.annotation.Annotation;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Olivier Lamy
|
||||||
|
*/
|
||||||
|
public class MojoClassVisitor
|
||||||
|
implements ClassVisitor
|
||||||
|
{
|
||||||
|
private Logger logger;
|
||||||
|
|
||||||
|
private MojoAnnotatedClass mojoAnnotatedClass;
|
||||||
|
|
||||||
|
private Map<String, MojoAnnotationVisitor> annotationVisitorMap = new HashMap<String, MojoAnnotationVisitor>();
|
||||||
|
|
||||||
|
private List<MojoFieldVisitor> fieldVisitors = new ArrayList<MojoFieldVisitor>();
|
||||||
|
|
||||||
|
public MojoClassVisitor( Logger logger )
|
||||||
|
{
|
||||||
|
this.logger = logger;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MojoAnnotatedClass getMojoAnnotatedClass()
|
||||||
|
{
|
||||||
|
return mojoAnnotatedClass;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMojoAnnotatedClass( MojoAnnotatedClass mojoAnnotatedClass )
|
||||||
|
{
|
||||||
|
this.mojoAnnotatedClass = mojoAnnotatedClass;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<String, MojoAnnotationVisitor> getAnnotationVisitorMap()
|
||||||
|
{
|
||||||
|
return annotationVisitorMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAnnotationVisitorMap( Map<String, MojoAnnotationVisitor> annotationVisitorMap )
|
||||||
|
{
|
||||||
|
this.annotationVisitorMap = annotationVisitorMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<MojoFieldVisitor> getFieldVisitors()
|
||||||
|
{
|
||||||
|
return fieldVisitors;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFieldVisitors( List<MojoFieldVisitor> fieldVisitors )
|
||||||
|
{
|
||||||
|
this.fieldVisitors = fieldVisitors;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<MojoFieldVisitor> findFieldWithAnnotationClass( String annotationClassName )
|
||||||
|
{
|
||||||
|
List<MojoFieldVisitor> mojoFieldVisitors = new ArrayList<MojoFieldVisitor>();
|
||||||
|
|
||||||
|
for ( MojoFieldVisitor mojoFieldVisitor : this.fieldVisitors )
|
||||||
|
{
|
||||||
|
MojoAnnotationVisitor mojoAnnotationVisitor = mojoFieldVisitor.getMojoAnnotationVisitor();
|
||||||
|
if ( mojoAnnotationVisitor != null && StringUtils.equals( annotationClassName,
|
||||||
|
mojoAnnotationVisitor.annotationClassName ) )
|
||||||
|
{
|
||||||
|
mojoFieldVisitors.add( mojoFieldVisitor );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return mojoFieldVisitors;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void visit( int version, int access, String name, String signature, String superName, String[] interfaces )
|
||||||
|
{
|
||||||
|
mojoAnnotatedClass = new MojoAnnotatedClass();
|
||||||
|
mojoAnnotatedClass.setClassName( Type.getObjectType( name ).getClassName() ).setParentClassName(
|
||||||
|
Type.getObjectType( superName ).getClassName() );
|
||||||
|
logger.debug( "MojoClassVisitor#visit" );
|
||||||
|
}
|
||||||
|
|
||||||
|
public AnnotationVisitor visitAnnotation( String desc, boolean visible )
|
||||||
|
{
|
||||||
|
logger.debug( "MojoClassVisitor#visitAnnotation" );
|
||||||
|
String annotationClassName = Type.getType( desc ).getClassName();
|
||||||
|
if ( !MojoAnnotationsScanner.acceptedClassLevelAnnotationClasses.contains( annotationClassName ) )
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
MojoAnnotationVisitor mojoAnnotationVisitor = new MojoAnnotationVisitor( logger, annotationClassName );
|
||||||
|
annotationVisitorMap.put( annotationClassName, mojoAnnotationVisitor );
|
||||||
|
return mojoAnnotationVisitor;
|
||||||
|
}
|
||||||
|
|
||||||
|
public FieldVisitor visitField( int access, String name, String desc, String signature, Object value )
|
||||||
|
{
|
||||||
|
// Type.getType( desc ).getClassName()
|
||||||
|
logger.debug( "MojoClassVisitor#visitField" );
|
||||||
|
MojoFieldVisitor mojoFieldVisitor = new MojoFieldVisitor( logger, name );
|
||||||
|
fieldVisitors.add( mojoFieldVisitor );
|
||||||
|
return mojoFieldVisitor;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MethodVisitor visitMethod( int access, String name, String desc, String signature, String[] exceptions )
|
||||||
|
{
|
||||||
|
// we don't need methods informations
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void visitAttribute( Attribute attr )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public void visitSource( String source, String debug )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public void visitOuterClass( String owner, String name, String desc )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public void visitInnerClass( String name, String outerName, String innerName, int access )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public void visitEnd()
|
||||||
|
{
|
||||||
|
logger.debug( "MojoClassVisitor#visitEnd" );
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class MojoAnnotationContent
|
||||||
|
implements Mojo
|
||||||
|
{
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
private LifecyclePhase defaultPhase = LifecyclePhase.NONE;
|
||||||
|
|
||||||
|
private String requiresDependencyResolution = "runtime";
|
||||||
|
|
||||||
|
private String requiresDependencyCollection = "runtime";
|
||||||
|
|
||||||
|
private String instantiationStrategy = "per-lookup";
|
||||||
|
|
||||||
|
private String executionStrategy = "once-per-session";
|
||||||
|
|
||||||
|
private boolean requiresProject = true;
|
||||||
|
|
||||||
|
private boolean requiresReports = false;
|
||||||
|
|
||||||
|
private boolean aggregator = false;
|
||||||
|
|
||||||
|
private boolean requiresDirectInvocation = false;
|
||||||
|
|
||||||
|
private boolean requiresOnline = false;
|
||||||
|
|
||||||
|
private boolean inheritByDefault = true;
|
||||||
|
|
||||||
|
private String configurator;
|
||||||
|
|
||||||
|
private boolean threadSafe = false;
|
||||||
|
|
||||||
|
public Class<? extends Annotation> annotationType()
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public LifecyclePhase defaultPhase()
|
||||||
|
{
|
||||||
|
return defaultPhase;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void defaultPhase( String phase )
|
||||||
|
{
|
||||||
|
this.defaultPhase = LifecyclePhase.valueOf( phase );
|
||||||
|
}
|
||||||
|
|
||||||
|
public String requiresDependencyResolution()
|
||||||
|
{
|
||||||
|
return requiresDependencyResolution;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void requiresDependencyResolution( String requiresDependencyResolution )
|
||||||
|
{
|
||||||
|
this.requiresDependencyResolution = requiresDependencyResolution;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String requiresDependencyCollection()
|
||||||
|
{
|
||||||
|
return requiresDependencyCollection;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void requiresDependencyCollection( String requiresDependencyCollection )
|
||||||
|
{
|
||||||
|
this.requiresDependencyCollection = requiresDependencyCollection;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String instantiationStrategy()
|
||||||
|
{
|
||||||
|
return instantiationStrategy;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void instantiationStrategy( String instantiationStrategy )
|
||||||
|
{
|
||||||
|
this.instantiationStrategy = instantiationStrategy;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String executionStrategy()
|
||||||
|
{
|
||||||
|
return executionStrategy;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void executionStrategy( String executionStrategy )
|
||||||
|
{
|
||||||
|
this.executionStrategy = executionStrategy;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean requiresProject()
|
||||||
|
{
|
||||||
|
return requiresProject;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void requiresProject( boolean requiresProject )
|
||||||
|
{
|
||||||
|
this.requiresProject = requiresProject;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean requiresReports()
|
||||||
|
{
|
||||||
|
return requiresReports;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void requiresReports( boolean requiresReports )
|
||||||
|
{
|
||||||
|
this.requiresReports = requiresReports;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean aggregator()
|
||||||
|
{
|
||||||
|
return aggregator;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void aggregator( boolean aggregator )
|
||||||
|
{
|
||||||
|
this.aggregator = aggregator;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean requiresDirectInvocation()
|
||||||
|
{
|
||||||
|
return requiresDirectInvocation;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void requiresDirectInvocation( boolean requiresDirectInvocation )
|
||||||
|
{
|
||||||
|
this.requiresDirectInvocation = requiresDirectInvocation;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean requiresOnline()
|
||||||
|
{
|
||||||
|
return requiresOnline;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void requiresOnline( boolean requiresOnline )
|
||||||
|
{
|
||||||
|
this.requiresOnline = requiresOnline;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean inheritByDefault()
|
||||||
|
{
|
||||||
|
return inheritByDefault;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void inheritByDefault( boolean inheritByDefault )
|
||||||
|
{
|
||||||
|
this.inheritByDefault = inheritByDefault;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String configurator()
|
||||||
|
{
|
||||||
|
return configurator;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void configurator( String configurator )
|
||||||
|
{
|
||||||
|
this.configurator = configurator;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean threadSafe()
|
||||||
|
{
|
||||||
|
return threadSafe;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void threadSafe( boolean threadSafe )
|
||||||
|
{
|
||||||
|
this.threadSafe = threadSafe;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String name()
|
||||||
|
{
|
||||||
|
return this.name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void name( String name )
|
||||||
|
{
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString()
|
||||||
|
{
|
||||||
|
final StringBuilder sb = new StringBuilder();
|
||||||
|
sb.append( "MojoAnnotationContent" );
|
||||||
|
sb.append( "{name='" ).append( name ).append( '\'' );
|
||||||
|
sb.append( ", defaultPhase=" ).append( defaultPhase );
|
||||||
|
sb.append( ", requiresDependencyResolution='" ).append( requiresDependencyResolution ).append( '\'' );
|
||||||
|
sb.append( ", requiresDependencyCollection='" ).append( requiresDependencyCollection ).append( '\'' );
|
||||||
|
sb.append( ", instantiationStrategy='" ).append( instantiationStrategy ).append( '\'' );
|
||||||
|
sb.append( ", executionStrategy='" ).append( executionStrategy ).append( '\'' );
|
||||||
|
sb.append( ", requiresProject=" ).append( requiresProject );
|
||||||
|
sb.append( ", requiresReports=" ).append( requiresReports );
|
||||||
|
sb.append( ", aggregator=" ).append( aggregator );
|
||||||
|
sb.append( ", requiresDirectInvocation=" ).append( requiresDirectInvocation );
|
||||||
|
sb.append( ", requiresOnline=" ).append( requiresOnline );
|
||||||
|
sb.append( ", inheritByDefault=" ).append( inheritByDefault );
|
||||||
|
sb.append( ", configurator='" ).append( configurator ).append( '\'' );
|
||||||
|
sb.append( ", threadSafe=" ).append( threadSafe );
|
||||||
|
sb.append( '}' );
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class ExecuteAnnotationContent
|
||||||
|
implements Execute
|
||||||
|
{
|
||||||
|
|
||||||
|
private String goal;
|
||||||
|
|
||||||
|
private String lifecycle;
|
||||||
|
|
||||||
|
private LifecyclePhase phase;
|
||||||
|
|
||||||
|
public LifecyclePhase phase()
|
||||||
|
{
|
||||||
|
return this.phase;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String goal()
|
||||||
|
{
|
||||||
|
return this.goal;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String lifecycle()
|
||||||
|
{
|
||||||
|
return this.lifecycle;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void phase( String phase )
|
||||||
|
{
|
||||||
|
this.phase = LifecyclePhase.valueOf( phase );
|
||||||
|
}
|
||||||
|
|
||||||
|
public void goal( String goal )
|
||||||
|
{
|
||||||
|
this.goal = goal;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void lifecycle( String lifecycle )
|
||||||
|
{
|
||||||
|
this.lifecycle = lifecycle;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public Class<? extends Annotation> annotationType()
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString()
|
||||||
|
{
|
||||||
|
final StringBuilder sb = new StringBuilder();
|
||||||
|
sb.append( "ExecuteAnnotationContent" );
|
||||||
|
sb.append( "{goal='" ).append( goal ).append( '\'' );
|
||||||
|
sb.append( ", lifecycle='" ).append( lifecycle ).append( '\'' );
|
||||||
|
sb.append( ", phase=" ).append( phase );
|
||||||
|
sb.append( '}' );
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------
|
||||||
|
// internal classes
|
||||||
|
//-------------------------------------
|
||||||
|
static class MojoAnnotationVisitor
|
||||||
|
implements AnnotationVisitor
|
||||||
|
{
|
||||||
|
|
||||||
|
private Logger logger;
|
||||||
|
|
||||||
|
private String annotationClassName;
|
||||||
|
|
||||||
|
private Map<String, Object> annotationValues = new HashMap<String, Object>();
|
||||||
|
|
||||||
|
MojoAnnotationVisitor( Logger logger, String annotationClassName )
|
||||||
|
{
|
||||||
|
this.logger = logger;
|
||||||
|
this.annotationClassName = annotationClassName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<String, Object> getAnnotationValues()
|
||||||
|
{
|
||||||
|
return annotationValues;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void visit( String name, Object value )
|
||||||
|
{
|
||||||
|
annotationValues.put( name, value );
|
||||||
|
logger.debug( "MojoAnnotationVisitor#visit:" + name + ":" + value );
|
||||||
|
}
|
||||||
|
|
||||||
|
public void visitEnum( String name, String desc, String value )
|
||||||
|
{
|
||||||
|
annotationValues.put( name, value );
|
||||||
|
logger.debug( "MojoAnnotationVisitor#visitEnum:" + name + ":" + desc + ":" + value );
|
||||||
|
}
|
||||||
|
|
||||||
|
public AnnotationVisitor visitAnnotation( String name, String desc )
|
||||||
|
{
|
||||||
|
logger.debug( "MojoAnnotationVisitor#visitAnnotation:" + name + ":" + desc );
|
||||||
|
return new MojoAnnotationVisitor( logger, this.annotationClassName );
|
||||||
|
}
|
||||||
|
|
||||||
|
public AnnotationVisitor visitArray( String s )
|
||||||
|
{
|
||||||
|
logger.debug( "MojoAnnotationVisitor#visitArray" );
|
||||||
|
return new MojoAnnotationVisitor( logger, this.annotationClassName );
|
||||||
|
}
|
||||||
|
|
||||||
|
public void visitEnd()
|
||||||
|
{
|
||||||
|
logger.debug( "MojoAnnotationVisitor#visitEnd" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static class MojoFieldVisitor
|
||||||
|
implements FieldVisitor
|
||||||
|
{
|
||||||
|
private Logger logger;
|
||||||
|
|
||||||
|
private String fieldName;
|
||||||
|
|
||||||
|
private MojoAnnotationVisitor mojoAnnotationVisitor;
|
||||||
|
|
||||||
|
MojoFieldVisitor( Logger logger, String fieldName )
|
||||||
|
{
|
||||||
|
this.logger = logger;
|
||||||
|
this.fieldName = fieldName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MojoAnnotationVisitor getMojoAnnotationVisitor()
|
||||||
|
{
|
||||||
|
return mojoAnnotationVisitor;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getFieldName()
|
||||||
|
{
|
||||||
|
return fieldName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AnnotationVisitor visitAnnotation( String desc, boolean visible )
|
||||||
|
{
|
||||||
|
logger.debug( "MojoFieldVisitor#visitAnnotation:" + desc );
|
||||||
|
String annotationClassName = Type.getType( desc ).getClassName();
|
||||||
|
if ( !MojoAnnotationsScanner.acceptedFieldLevelAnnotationClasses.contains( annotationClassName ) )
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
mojoAnnotationVisitor = new MojoAnnotationVisitor( logger, annotationClassName );
|
||||||
|
return mojoAnnotationVisitor;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void visitAttribute( Attribute attribute )
|
||||||
|
{
|
||||||
|
logger.debug( "MojoFieldVisitor#visitAttribute" );
|
||||||
|
}
|
||||||
|
|
||||||
|
public void visitEnd()
|
||||||
|
{
|
||||||
|
logger.debug( "MojoFieldVisitor#visitEnd" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,184 @@
|
||||||
|
package org.apache.maven.tools.plugin.annotations.scanner;
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import org.apache.maven.tools.plugin.annotations.Parameter;
|
||||||
|
|
||||||
|
import java.lang.annotation.Annotation;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Olivier Lamy
|
||||||
|
*/
|
||||||
|
public class ParameterAnnotationContent
|
||||||
|
extends AnnotatedField
|
||||||
|
implements Parameter
|
||||||
|
{
|
||||||
|
|
||||||
|
private String alias;
|
||||||
|
|
||||||
|
private String expression;
|
||||||
|
|
||||||
|
private String defaultValue;
|
||||||
|
|
||||||
|
private boolean required = false;
|
||||||
|
|
||||||
|
private boolean readonly = false;
|
||||||
|
|
||||||
|
public ParameterAnnotationContent( String fieldName )
|
||||||
|
{
|
||||||
|
super( fieldName );
|
||||||
|
}
|
||||||
|
|
||||||
|
public ParameterAnnotationContent( String fieldName, String alias, String expression, String defaultValue,
|
||||||
|
boolean required, boolean readonly )
|
||||||
|
{
|
||||||
|
this( fieldName );
|
||||||
|
this.alias = alias;
|
||||||
|
this.expression = expression;
|
||||||
|
this.defaultValue = defaultValue;
|
||||||
|
this.required = required;
|
||||||
|
this.readonly = readonly;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String alias()
|
||||||
|
{
|
||||||
|
return alias;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void alias( String alias )
|
||||||
|
{
|
||||||
|
this.alias = alias;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String expression()
|
||||||
|
{
|
||||||
|
return expression;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void expression( String expression )
|
||||||
|
{
|
||||||
|
this.expression = expression;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String defaultValue()
|
||||||
|
{
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void defaultValue( String defaultValue )
|
||||||
|
{
|
||||||
|
this.defaultValue = defaultValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean required()
|
||||||
|
{
|
||||||
|
return required;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void required( boolean required )
|
||||||
|
{
|
||||||
|
this.required = required;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean readonly()
|
||||||
|
{
|
||||||
|
return readonly;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void readonly( boolean readonly )
|
||||||
|
{
|
||||||
|
this.readonly = readonly;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Class<? extends Annotation> annotationType()
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString()
|
||||||
|
{
|
||||||
|
final StringBuilder sb = new StringBuilder();
|
||||||
|
sb.append( super.toString() );
|
||||||
|
sb.append( "ParameterAnnotationContent" );
|
||||||
|
sb.append( "{alias='" ).append( alias ).append( '\'' );
|
||||||
|
sb.append( ", expression='" ).append( expression ).append( '\'' );
|
||||||
|
sb.append( ", defaultValue='" ).append( defaultValue ).append( '\'' );
|
||||||
|
sb.append( ", required=" ).append( required );
|
||||||
|
sb.append( ", readonly=" ).append( readonly );
|
||||||
|
sb.append( '}' );
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals( Object o )
|
||||||
|
{
|
||||||
|
if ( this == o )
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if ( !( o instanceof ParameterAnnotationContent ) )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
ParameterAnnotationContent that = (ParameterAnnotationContent) o;
|
||||||
|
|
||||||
|
if ( readonly != that.readonly )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ( required != that.required )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( getFieldName() != null ? !getFieldName().equals( that.getFieldName() ) : that.getFieldName() != null )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( alias != null ? !alias.equals( that.alias ) : that.alias != null )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ( defaultValue != null ? !defaultValue.equals( that.defaultValue ) : that.defaultValue != null )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ( expression != null ? !expression.equals( that.expression ) : that.expression != null )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode()
|
||||||
|
{
|
||||||
|
int result = alias != null ? alias.hashCode() : 0;
|
||||||
|
result = 31 * result + ( getFieldName() != null ? getFieldName().hashCode() : 0 );
|
||||||
|
result = 31 * result + ( expression != null ? expression.hashCode() : 0 );
|
||||||
|
result = 31 * result + ( defaultValue != null ? defaultValue.hashCode() : 0 );
|
||||||
|
result = 31 * result + ( required ? 1 : 0 );
|
||||||
|
result = 31 * result + ( readonly ? 1 : 0 );
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,42 @@
|
||||||
|
<!--
|
||||||
|
~ Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
~ or more contributor license agreements. See the NOTICE file
|
||||||
|
~ distributed with this work for additional information
|
||||||
|
~ regarding copyright ownership. The ASF licenses this file
|
||||||
|
~ to you under the Apache License, Version 2.0 (the
|
||||||
|
~ "License"); you may not use this file except in compliance
|
||||||
|
~ with the License. You may obtain a copy of the License at
|
||||||
|
~
|
||||||
|
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
~
|
||||||
|
~ Unless required by applicable law or agreed to in writing,
|
||||||
|
~ software distributed under the License is distributed on an
|
||||||
|
~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
~ KIND, either express or implied. See the License for the
|
||||||
|
~ specific language governing permissions and limitations
|
||||||
|
~ under the License.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<component-set>
|
||||||
|
<components>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
|
|
||||||
|
| JavaMojoDescriptorExtractor, a MojoDescriptor extractor to read
|
||||||
|
| descriptors from java classes with annotations.
|
||||||
|
|
|
||||||
|
-->
|
||||||
|
<component>
|
||||||
|
<role>org.apache.maven.tools.plugin.extractor.MojoDescriptorExtractor</role>
|
||||||
|
<role-hint>java-annotations</role-hint>
|
||||||
|
<implementation>org.apache.maven.tools.plugin.annotations.JavaAnnotationsMojoDescriptorExtractor</implementation>
|
||||||
|
</component>
|
||||||
|
|
||||||
|
<component>
|
||||||
|
<role>org.apache.maven.tools.plugin.annotations.scanner.MojoAnnotationsScanner</role>
|
||||||
|
<role-hint>default</role-hint>
|
||||||
|
<implementation>org.apache.maven.tools.plugin.annotations.scanner.DefaultMojoAnnotationsScanner</implementation>
|
||||||
|
</component>
|
||||||
|
|
||||||
|
</components>
|
||||||
|
</component-set>
|
||||||
|
|
@ -0,0 +1,50 @@
|
||||||
|
package org.apache.maven.tools.plugin.annotations;
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import org.apache.maven.plugin.AbstractMojo;
|
||||||
|
import org.apache.maven.plugin.MojoExecutionException;
|
||||||
|
import org.apache.maven.plugin.MojoFailureException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Olivier Lamy
|
||||||
|
*/
|
||||||
|
@Mojo( name = "foo", defaultPhase = LifecyclePhase.COMPILE, threadSafe = true )
|
||||||
|
@Execute( goal = "compiler", lifecycle = "my-lifecycle", phase = LifecyclePhase.PACKAGE )
|
||||||
|
public class FooMojo
|
||||||
|
extends AbstractMojo
|
||||||
|
{
|
||||||
|
@Parameter( expression = "${thebar}" )
|
||||||
|
private String bar;
|
||||||
|
|
||||||
|
@Parameter( expression = "${thebeer}" )
|
||||||
|
private String beer;
|
||||||
|
|
||||||
|
@Component( role = "wine", roleHint = "bordeaux" )
|
||||||
|
private Mojo wine;
|
||||||
|
|
||||||
|
@Component( role = "wine", roleHint = "foo" )
|
||||||
|
private Mojo foo;
|
||||||
|
|
||||||
|
public void execute()
|
||||||
|
throws MojoExecutionException, MojoFailureException
|
||||||
|
{
|
||||||
|
// nothing
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,78 @@
|
||||||
|
package org.apache.maven.tools.plugin.annotations;
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import org.apache.maven.tools.plugin.annotations.scanner.ComponentAnnotationContent;
|
||||||
|
import org.apache.maven.tools.plugin.annotations.scanner.MojoAnnotatedClass;
|
||||||
|
import org.apache.maven.tools.plugin.annotations.scanner.MojoAnnotationsScanner;
|
||||||
|
import org.apache.maven.tools.plugin.annotations.scanner.MojoAnnotationsScannerRequest;
|
||||||
|
import org.apache.maven.tools.plugin.annotations.scanner.ParameterAnnotationContent;
|
||||||
|
import org.codehaus.plexus.PlexusTestCase;
|
||||||
|
import org.fest.assertions.Assertions;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Olivier Lamy
|
||||||
|
*/
|
||||||
|
public class TestAnnotationsReader
|
||||||
|
extends PlexusTestCase
|
||||||
|
{
|
||||||
|
public void testReadMojoClass()
|
||||||
|
throws Exception
|
||||||
|
{
|
||||||
|
MojoAnnotationsScanner mojoAnnotationsScanner = (MojoAnnotationsScanner) lookup( MojoAnnotationsScanner.ROLE );
|
||||||
|
|
||||||
|
MojoAnnotationsScannerRequest request = new MojoAnnotationsScannerRequest();
|
||||||
|
request.setClassesDirectories( Collections.singletonList( new File( "target/test-classes" ) ) );
|
||||||
|
request.setIncludePatterns( Arrays.asList( "**/FooMojo.class" ) );
|
||||||
|
|
||||||
|
List<MojoAnnotatedClass> mojoAnnotatedClasses = mojoAnnotationsScanner.scan( request );
|
||||||
|
|
||||||
|
System.out.println( "mojoAnnotatedClasses:" + mojoAnnotatedClasses );
|
||||||
|
|
||||||
|
Assertions.assertThat( mojoAnnotatedClasses ).isNotNull().isNotEmpty().hasSize( 1 );
|
||||||
|
|
||||||
|
MojoAnnotatedClass mojoAnnotatedClass = mojoAnnotatedClasses.get( 0 );
|
||||||
|
|
||||||
|
Mojo mojo = mojoAnnotatedClass.getMojo();
|
||||||
|
|
||||||
|
assertEquals( "foo", mojo.name() );
|
||||||
|
assertEquals( true, mojo.threadSafe() );
|
||||||
|
assertEquals( false, mojo.aggregator() );
|
||||||
|
assertEquals( LifecyclePhase.COMPILE, mojo.defaultPhase() );
|
||||||
|
|
||||||
|
Execute execute = mojoAnnotatedClass.getExecute();
|
||||||
|
|
||||||
|
assertEquals( "compiler", execute.goal() );
|
||||||
|
assertEquals( "my-lifecycle", execute.lifecycle() );
|
||||||
|
assertEquals( LifecyclePhase.PACKAGE, execute.phase() );
|
||||||
|
|
||||||
|
List<ComponentAnnotationContent> components = mojoAnnotatedClass.getComponents();
|
||||||
|
Assertions.assertThat( components ).isNotNull().isNotEmpty().hasSize( 2 );
|
||||||
|
|
||||||
|
List<ParameterAnnotationContent> parameters = mojoAnnotatedClass.getParameters();
|
||||||
|
Assertions.assertThat( parameters ).isNotNull().isNotEmpty().hasSize( 2 ).contains(
|
||||||
|
new ParameterAnnotationContent( "bar", null, "${thebar}", null, false, false ),
|
||||||
|
new ParameterAnnotationContent( "beer", null, "${thebeer}", null, false, false ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
8
pom.xml
8
pom.xml
|
|
@ -215,7 +215,7 @@
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.codehaus.plexus</groupId>
|
<groupId>org.codehaus.plexus</groupId>
|
||||||
<artifactId>plexus-utils</artifactId>
|
<artifactId>plexus-utils</artifactId>
|
||||||
<version>2.0.5</version>
|
<version>3.0</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.codehaus.plexus</groupId>
|
<groupId>org.codehaus.plexus</groupId>
|
||||||
|
|
@ -239,6 +239,12 @@
|
||||||
<version>3.8.2</version>
|
<version>3.8.2</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.easytesting</groupId>
|
||||||
|
<artifactId>fest-assert</artifactId>
|
||||||
|
<version>1.4</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue