diff --git a/src/main/java/org/codehaus/mojo/clirr/AbstractClirrMojo.java b/src/main/java/org/codehaus/mojo/clirr/AbstractClirrMojo.java index 5d287f4..08291c0 100644 --- a/src/main/java/org/codehaus/mojo/clirr/AbstractClirrMojo.java +++ b/src/main/java/org/codehaus/mojo/clirr/AbstractClirrMojo.java @@ -185,6 +185,15 @@ public abstract class AbstractClirrMojo */ protected String[] excludes; + /** + * A list of annotations marking special classes and interfaces to be excluded from comparison. + * Classes annotated with these annotations are excluded from the list of classes that are included. + * Values are specified in class name notation, e.g. java.lang.Deprecated. + * + * @parameter + */ + protected String[] excludeAnnotated; + /** * A list of differences reported by Clirr that should be ignored when producing the final report. * Values specified here will be joined with the ones specified using the "ignoredDifferencesFile" @@ -258,7 +267,7 @@ protected ClirrDiffListener executeClirr( Severity minSeverity ) { ClirrDiffListener listener = new ClirrDiffListener(); - ClassFilter classFilter = new ClirrClassFilter( includes, excludes ); + ClassFilter classFilter = new ClirrClassFilter( includes, excludes, excludeAnnotated ); JavaType[] origClasses = resolvePreviousReleaseClasses( classFilter ); diff --git a/src/main/java/org/codehaus/mojo/clirr/ClirrArbitraryCheckMojo.java b/src/main/java/org/codehaus/mojo/clirr/ClirrArbitraryCheckMojo.java index 90eb98f..71be590 100644 --- a/src/main/java/org/codehaus/mojo/clirr/ClirrArbitraryCheckMojo.java +++ b/src/main/java/org/codehaus/mojo/clirr/ClirrArbitraryCheckMojo.java @@ -239,7 +239,7 @@ protected ClirrDiffListener executeClirr( Severity minSeverity ) { ClirrDiffListener listener = new ClirrDiffListener(); - ClassFilter classFilter = new ClirrClassFilter( includes, excludes ); + ClassFilter classFilter = new ClirrClassFilter( includes, excludes, excludeAnnotated ); JavaType[] origClasses = resolveClasses( oldComparisonArtifacts, classFilter ); diff --git a/src/main/java/org/codehaus/mojo/clirr/ClirrClassFilter.java b/src/main/java/org/codehaus/mojo/clirr/ClirrClassFilter.java index 9ff8587..c5bd5c9 100644 --- a/src/main/java/org/codehaus/mojo/clirr/ClirrClassFilter.java +++ b/src/main/java/org/codehaus/mojo/clirr/ClirrClassFilter.java @@ -16,10 +16,12 @@ * limitations under the License. */ -import net.sf.clirr.core.ClassFilter; +import org.apache.bcel.classfile.AnnotationEntry; import org.apache.bcel.classfile.JavaClass; import org.codehaus.plexus.util.SelectorUtils; +import net.sf.clirr.core.ClassFilter; + /** * Filter classes by pattern sets. * @@ -32,9 +34,16 @@ public class ClirrClassFilter private final String[] includes; + private final String[] excludeAnnotated; + private boolean alwaysTrue; public ClirrClassFilter( String[] includes, String[] excludes ) + { + this( includes, excludes, null ); + } + + public ClirrClassFilter( String[] includes, String[] excludes, String[] excludeAnnotated ) { if ( excludes == null || excludes.length == 0 ) { @@ -58,6 +67,18 @@ public ClirrClassFilter( String[] includes, String[] excludes ) { this.includes = (String[]) includes.clone(); } + + if ( excludeAnnotated == null || excludeAnnotated.length == 0 ) + { + this.excludeAnnotated = null; + } + else { + this.excludeAnnotated = new String[excludeAnnotated.length]; + for (int i = 0; i < excludeAnnotated.length; i++) + { + this.excludeAnnotated[i] = "L" + excludeAnnotated[i].replace( '.', '/' ) + ";"; + } + } } public boolean isSelected( JavaClass javaClass ) @@ -82,6 +103,26 @@ public boolean isSelected( JavaClass javaClass ) result = !SelectorUtils.matchPath( excludes[i], path ); } } + + if (excludeAnnotated != null) + { + final AnnotationEntry[] annotationEntries = javaClass.getAnnotationEntries(); + if (annotationEntries != null) + { + for (AnnotationEntry annotationEntry : annotationEntries) + { + final String annotationType = annotationEntry.getAnnotationType(); + for ( String annotated: excludeAnnotated ) + { + if ( annotationType.equals(annotated) ) + { + return false; + } + } + } + } + } + } return result;