package com.fasterxml.jackson.databind.introspect;
import com.fasterxml.jackson.databind.AnnotationIntrospector;
import com.fasterxml.jackson.databind.BeanProperty;
import com.fasterxml.jackson.databind.util.Named;
/**
* Simple value classes that contain definitions of properties,
* used during introspection of properties to use for
* serialization and deserialization purposes.
* These instances are created before actual {@link BeanProperty}
* instances are created, i.e. they are used earlier in the process
* flow, and are typically use to construct actual
* {@link BeanProperty} instances.
*/
public abstract class BeanPropertyDefinition
implements Named
{
/*
/**********************************************************
/* Fluent factory methods for creating modified copies
/**********************************************************
*/
/**
* Method that can be used to create a definition with
* same settings as this one, but with different
* (external) name; that is, one for which
* {@link #getName()} would return <code>newName</code>.
*/
public abstract BeanPropertyDefinition withName(String newName);
/*
/**********************************************************
/* Basic property information, name, type
/**********************************************************
*/
/**
* Accessor for name used for external representation (in JSON).
*/
// @Override // from Named
public abstract String getName();
/**
* Accessor that can be used to determine implicit name from underlying
* element(s) before possible renaming. This is the "internal"
* name derived from accessor ("x" from "getX"), and is not based on
* annotations or naming strategy.
*/
public abstract String getInternalName();
/**
* Accessor that can be called to check whether property was included
* due to an explicit marker (usually annotation), or just by naming
* convention.
*
* @return True if property was explicitly included (usually by having
* one of components being annotated); false if inclusion was purely
* due to naming or visibility definitions (that is, implicit)
*/
public abstract boolean isExplicitlyIncluded();
/*
/**********************************************************
/* Capabilities
/**********************************************************
*/
public boolean couldDeserialize() {
return getMutator() != null;
}
public boolean couldSerialize() {
return getAccessor() != null;
}
/*
/**********************************************************
/* Access to accessors (fields, methods etc)
/**********************************************************
*/
public abstract boolean hasGetter();
public abstract boolean hasSetter();
public abstract boolean hasField();
public abstract boolean hasConstructorParameter();
public abstract AnnotatedMethod getGetter();
public abstract AnnotatedMethod getSetter();
public abstract AnnotatedField getField();
public abstract AnnotatedParameter getConstructorParameter();
/**
* Method used to find accessor (getter, field to access) to use for accessing
* value of the property.
* Null if no such member exists.
*/
public abstract AnnotatedMember getAccessor();
/**
* Method used to find mutator (constructor parameter, setter, field) to use for
* changing value of the property.
* Null if no such member exists.
*/
public abstract AnnotatedMember getMutator();
/**
* Method used to find the property member (getter, setter, field) that has
* the highest precedence in current context (getter method when serializing,
* if available, and so forth), if any.
*
* @since 2.1
*/
public AnnotatedMember getPrimaryMember() {
return null;
}
/*
/**********************************************************
/* More refined access to configuration features
/* (usually based on annotations)
/* Since most trivial implementations do not support
/* these methods, they are implemented as no-ops.
/**********************************************************
*/
/**
* Method used to find View-inclusion definitions for the property.
*/
public Class<?>[] findViews() { return null; }
/**
* Method used to find whether property is part of a bi-directional
* reference.
*/
public AnnotationIntrospector.ReferenceProperty findReferenceType() {
return null;
}
/**
* Method used to check whether this logical property has a marker
* to indicate it should be used as the type id for polymorphic type
* handling.
*/
public boolean isTypeId() {
return false;
}
/**
* Method used to check whether this logical property indicates that
* value POJOs should be written using additional Object Identifier
* (or, when multiple references exist, all but first AS Object Identifier).
*/
public ObjectIdInfo findObjectIdInfo() {
return null;
}
/**
* Method used to check if this property is expected to have a value;
* and if none found, should either be considered invalid (and most likely
* fail deserialization), or handled by other means (by providing default
* value)
*/
public boolean isRequired() {
return false;
}
}