package com.fasterxml.classmate;
import java.io.Serializable;
import java.lang.annotation.Annotation;
import java.util.*;
import com.fasterxml.classmate.util.ClassKey;
Interface for object that determines handling of annotations in regards
to inheritance, overrides.
/**
* Interface for object that determines handling of annotations in regards
* to inheritance, overrides.
*/
@SuppressWarnings("serial")
public abstract class AnnotationConfiguration implements Serializable
{
Method called to figure out how to handle instances of specified annotation
type when used as class annotation.
/**
* Method called to figure out how to handle instances of specified annotation
* type when used as class annotation.
*/
public abstract AnnotationInclusion getInclusionForClass(Class<? extends Annotation> annotationType);
Method called to figure out how to handle instances of specified annotation
type when used as constructor annotation.
Note that constructor annotations can never be inherited so this just determines
between inclusion or non-inclusion.
/**
* Method called to figure out how to handle instances of specified annotation
* type when used as constructor annotation.
*<p>
* Note that constructor annotations can never be inherited so this just determines
* between inclusion or non-inclusion.
*/
public abstract AnnotationInclusion getInclusionForConstructor(Class<? extends Annotation> annotationType);
Method called to figure out how to handle instances of specified annotation
type when used as field annotation.
Note that field annotations can never be inherited so this just determines
between inclusion or non-inclusion.
/**
* Method called to figure out how to handle instances of specified annotation
* type when used as field annotation.
*<p>
* Note that field annotations can never be inherited so this just determines
* between inclusion or non-inclusion.
*/
public abstract AnnotationInclusion getInclusionForField(Class<? extends Annotation> annotationType);
Method called to figure out how to handle instances of specified annotation
type when used as method annotation.
Note that method annotations can be inherited for member methods, but not for static
methods; for static methods thereby this just determines between inclusion and
non-inclusion.
/**
* Method called to figure out how to handle instances of specified annotation
* type when used as method annotation.
*<p>
* Note that method annotations can be inherited for member methods, but not for static
* methods; for static methods thereby this just determines between inclusion and
* non-inclusion.
*/
public abstract AnnotationInclusion getInclusionForMethod(Class<? extends Annotation> annotationType);
Method called to figure out how to handle instances of specified annotation
type when used as parameter annotation.
Note that parameter annotations can be inherited for member methods, but not for static
methods; for static methods thereby this just determines between inclusion and
non-inclusion.
/**
* Method called to figure out how to handle instances of specified annotation
* type when used as parameter annotation.
*<p>
* Note that parameter annotations can be inherited for member methods, but not for static
* methods; for static methods thereby this just determines between inclusion and
* non-inclusion.
*/
public abstract AnnotationInclusion getInclusionForParameter(Class<? extends Annotation> annotationType);
Simple implementation that can be configured with default behavior
for unknown annotations, as well as explicit behaviors for
enumerated annotation types. Same default is used for both class and
member method annotations (constructor, field and static method
annotations are never inherited)
/**
* Simple implementation that can be configured with default behavior
* for unknown annotations, as well as explicit behaviors for
* enumerated annotation types. Same default is used for both class and
* member method annotations (constructor, field and static method
* annotations are never inherited)
*/
public static class StdConfiguration extends AnnotationConfiguration implements Serializable
{
protected final AnnotationInclusion _defaultInclusion;
protected final HashMap<ClassKey,AnnotationInclusion> _inclusions = new HashMap<ClassKey,AnnotationInclusion>();
public StdConfiguration(AnnotationInclusion defaultBehavior)
{
_defaultInclusion = defaultBehavior;
}
@Override
public AnnotationInclusion getInclusionForClass(Class<? extends Annotation> annotationType) {
return _inclusionFor(annotationType);
}
@Override
public AnnotationInclusion getInclusionForConstructor(Class<? extends Annotation> annotationType) {
return _inclusionFor(annotationType);
}
@Override
public AnnotationInclusion getInclusionForField(Class<? extends Annotation> annotationType) {
return getInclusionForClass(annotationType);
}
@Override
public AnnotationInclusion getInclusionForMethod(Class<? extends Annotation> annotationType) {
return getInclusionForClass(annotationType);
}
@Override
public AnnotationInclusion getInclusionForParameter(Class<? extends Annotation> annotationType) {
return getInclusionForClass(annotationType);
}
public void setInclusion(Class<? extends Annotation> annotationType, AnnotationInclusion incl)
{
_inclusions.put(new ClassKey(annotationType), incl);
}
protected AnnotationInclusion _inclusionFor(Class<? extends Annotation> annotationType)
{
ClassKey key = new ClassKey(annotationType);
AnnotationInclusion beh = _inclusions.get(key);
return (beh == null) ? _defaultInclusion : beh;
}
}
}