package com.fasterxml.jackson.annotation; import java.lang.annotation.*; import java.lang.reflect.Member; import java.lang.reflect.Modifier; /** * Class annotation that can be used to define which kinds of Methods * are to be detected by auto-detection, and with what minimum access level. * Auto-detection means using name conventions * and/or signature templates to find methods to use for data binding. * For example, so-called "getters" can be auto-detected by looking for * public member methods that return a value, do not take argument, * and have prefix "get" in their name. *
* Default setting for all accessors is {@link Visibility#DEFAULT}, which * in turn means that the global defaults are used. Defaults * are different for different accessor types (getters need to be public; * setters can have any access modifier, for example). * If you assign different {@link Visibility} type then it will override * global defaults: for example, to require that all setters must be public, * you would use: *
* @JsonAutoDetect(setterVisibility=Visibility.PUBLIC_ONLY) **/ @Target({ElementType.ANNOTATION_TYPE, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @JacksonAnnotation public @interface JsonAutoDetect { /** * Enumeration for possible visibility thresholds (minimum visibility) * that can be used to limit which methods (and fields) are * auto-detected. */ public enum Visibility { /** * Value that means that all kinds of access modifiers are acceptable, * from private to public. */ ANY, /** * Value that means that any other access modifier other than 'private' * is considered auto-detectable. */ NON_PRIVATE, /** * Value that means access modifiers 'protected' and 'public' are * auto-detectable (and 'private' and "package access" == no modifiers * are not) */ PROTECTED_AND_PUBLIC, /** * Value to indicate that only 'public' access modifier is considered * auto-detectable. */ PUBLIC_ONLY, /** * Value that indicates that no access modifiers are auto-detectable: * this can be used to explicitly disable auto-detection for specified * types. */ NONE, /** * Value that indicates that default visibility level (whatever it is, * depends on context) is to be used. This usually means that inherited * value (from parent visibility settings) is to be used. */ DEFAULT; public boolean isVisible(Member m) { switch (this) { case ANY: return true; case NONE: return false; case NON_PRIVATE: return !Modifier.isPrivate(m.getModifiers()); case PROTECTED_AND_PUBLIC: if (Modifier.isProtected(m.getModifiers())) { return true; } // fall through to public case: case PUBLIC_ONLY: return Modifier.isPublic(m.getModifiers()); default: return false; } } } /** * Minimum visibility required for auto-detecting regular getter methods. */ Visibility getterVisibility() default Visibility.DEFAULT; /** * Minimum visibility required for auto-detecting is-getter methods. */ Visibility isGetterVisibility() default Visibility.DEFAULT; /** * Minimum visibility required for auto-detecting setter methods. */ Visibility setterVisibility() default Visibility.DEFAULT; /** * Minimum visibility required for auto-detecting Creator methods, * except for no-argument constructors (which are always detected * no matter what). */ Visibility creatorVisibility() default Visibility.DEFAULT; /** * Minimum visibility required for auto-detecting member fields. */ Visibility fieldVisibility() default Visibility.DEFAULT; /* /********************************************************** /* Value class used to enclose information, allow for /* merging of layered configuration settings. /********************************************************** */ /** * Helper class used to contain information from a single {@link JsonIgnoreProperties} * annotation, as well as to provide possible overrides from non-annotation sources. * * @since 2.9 */ public static class Value implements JacksonAnnotationValue
ALL, all of them) set as specified; and the
* rest (if any) set as {@link Visibility#DEFAULT}).
*/
public static Value construct(PropertyAccessor acc, Visibility visibility) {
Visibility fields = Visibility.DEFAULT;
Visibility getters = Visibility.DEFAULT;
Visibility isGetters = Visibility.DEFAULT;
Visibility setters = Visibility.DEFAULT;
Visibility creators = Visibility.DEFAULT;
switch (acc) {
case CREATOR:
creators = visibility;
break;
case FIELD:
fields = visibility;
break;
case GETTER:
getters = visibility;
break;
case IS_GETTER:
isGetters = visibility;
break;
case NONE:
break;
case SETTER:
setters = visibility;
break;
case ALL: // default
fields = getters = isGetters = setters = creators = visibility;
break;
}
return construct(fields, getters, isGetters, setters, creators);
}
public static Value construct(Visibility fields,
Visibility getters, Visibility isGetters, Visibility setters,
Visibility creators)
{
Value v = _predefined(fields, getters, isGetters, setters, creators);
if (v == null) {
v = new Value(fields, getters, isGetters, setters, creators);
}
return v;
}
public Value withFieldVisibility(Visibility v) {
return construct(v, _getterVisibility, _isGetterVisibility,
_setterVisibility, _creatorVisibility);
}
public Value withGetterVisibility(Visibility v) {
return construct(_fieldVisibility, v, _isGetterVisibility,
_setterVisibility, _creatorVisibility);
}
public Value withIsGetterVisibility(Visibility v) {
return construct(_fieldVisibility, _getterVisibility, v,
_setterVisibility, _creatorVisibility);
}
public Value withSetterVisibility(Visibility v) {
return construct(_fieldVisibility, _getterVisibility, _isGetterVisibility,
v, _creatorVisibility);
}
public Value withCreatorVisibility(Visibility v) {
return construct(_fieldVisibility, _getterVisibility, _isGetterVisibility,
_setterVisibility, v);
}
public static Value merge(Value base, Value overrides)
{
return (base == null) ? overrides
: base.withOverrides(overrides);
}
public Value withOverrides(Value overrides) {
if ((overrides == null) || (overrides == NO_OVERRIDES) || (overrides == this)) {
return this;
}
if (_equals(this, overrides)) {
return this;
}
Visibility fields = overrides._fieldVisibility;
if (fields == Visibility.DEFAULT) {
fields = _fieldVisibility;
}
Visibility getters = overrides._getterVisibility;
if (getters == Visibility.DEFAULT) {
getters = _getterVisibility;
}
Visibility isGetters = overrides._isGetterVisibility;
if (isGetters == Visibility.DEFAULT) {
isGetters = _isGetterVisibility;
}
Visibility setters = overrides._setterVisibility;
if (setters == Visibility.DEFAULT) {
setters = _setterVisibility;
}
Visibility creators = overrides._creatorVisibility;
if (creators == Visibility.DEFAULT) {
creators = _creatorVisibility;
}
return construct(fields, getters, isGetters, setters, creators);
}
@Override
public Class