blob: 9c822650789499a214e1e6604a8ba669d261f061 [file] [log] [blame]
package org.codehaus.jackson.annotate;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
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.
* 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.
*<p>
* Pseudo-value <code>NONE</code> means that all auto-detection is disabled
* for the <b>specific</b> class that annotation is applied to (including
* its super-types, but only when resolving that class).
* Pseudo-value <code>ALWAYS</code> means that auto-detection is enabled
* for all method types for the class in similar way.
*<p>
* The default value is <code>ALWAYS</code>: that is, by default, auto-detection
* is enabled for all classes unless instructed otherwise.
*<p>
* Starting with version 1.5, it is also possible to use more fine-grained
* definitions, to basically define minimum visibility level needed. Defaults
* are different for different types (getters need to be public; setters can
* have any access modifier, for example).
*/
@Target(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.
*
* @since 1.5
*/
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());
}
return false;
}
}
/**
* Types of property elements (getters, setters, fields, creators) that
* can be auto-detected.
* NOTE: as of 1.5, it is recommended that instead of defining this property,
* distinct visibility properties are used instead. This because levels
* used with this method are not explicit, but global defaults that differ for different
* methods. As such, this property can be considered <b>deprecated</b> and
* only retained for backwards compatibility.
*/
JsonMethod[] value() default { JsonMethod.ALL };
/**
* Minimum visibility required for auto-detecting regular getter methods.
*
* @since 1.5
*/
Visibility getterVisibility() default Visibility.DEFAULT;
/**
* Minimum visibility required for auto-detecting is-getter methods.
*
* @since 1.5
*/
Visibility isGetterVisibility() default Visibility.DEFAULT;
/**
* Minimum visibility required for auto-detecting setter methods.
*
* @since 1.5
*/
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).
*
* @since 1.5
*/
Visibility creatorVisibility() default Visibility.DEFAULT;
/**
* Minimum visibility required for auto-detecting member fields.
*
* @since 1.5
*/
Visibility fieldVisibility() default Visibility.DEFAULT;
}