package com.fasterxml.jackson.databind.util; import com.fasterxml.jackson.databind.introspect.AnnotatedField; import com.fasterxml.jackson.databind.introspect.AnnotatedMember; import com.fasterxml.jackson.databind.introspect.AnnotatedMethod; import com.fasterxml.jackson.databind.introspect.AnnotatedParameter; import com.fasterxml.jackson.databind.introspect.BeanPropertyDefinition; /** * Simple immutable {@link BeanPropertyDefinition} implementation that can * be wrapped around a {@link AnnotatedMember} that is a simple * accessor (getter) or mutator (setter, constructor parameter) * (or both, for fields). */ public class SimpleBeanPropertyDefinition extends BeanPropertyDefinition { /** * Member that defines logical property. Assumption is that it * should be a 'simple' accessor; meaning a zero-argument getter, * single-argument setter or constructor parameter. */ protected final AnnotatedMember _member; protected final String _name; /* /********************************************************** /* Construction /********************************************************** */ public SimpleBeanPropertyDefinition(AnnotatedMember member) { this(member, member.getName()); } public SimpleBeanPropertyDefinition(AnnotatedMember member, String name) { _member = member; _name = name; } /* /********************************************************** /* Fluent factories /********************************************************** */ @Override public SimpleBeanPropertyDefinition withName(String newName) { if (_name.equals(newName)) { return this; } return new SimpleBeanPropertyDefinition(_member, newName); } /* /********************************************************** /* Basic property information, name, type /********************************************************** */ @Override public String getName() { return _name; } @Override public String getInternalName() { return getName(); } // hmmh. what should we claim here? @Override public boolean isExplicitlyIncluded() { return false; } /* /********************************************************** /* Access to accessors (fields, methods etc) /********************************************************** */ @Override public boolean hasGetter() { return (getGetter() != null); } @Override public boolean hasSetter() { return (getSetter() != null); } @Override public boolean hasField() { return (_member instanceof AnnotatedField); } @Override public boolean hasConstructorParameter() { return (_member instanceof AnnotatedParameter); } @Override public AnnotatedMethod getGetter() { if ((_member instanceof AnnotatedMethod) && ((AnnotatedMethod) _member).getParameterCount() == 0) { return (AnnotatedMethod) _member; } return null; } @Override public AnnotatedMethod getSetter() { if ((_member instanceof AnnotatedMethod) && ((AnnotatedMethod) _member).getParameterCount() == 1) { return (AnnotatedMethod) _member; } return null; } @Override public AnnotatedField getField() { return (_member instanceof AnnotatedField) ? (AnnotatedField) _member : null; } @Override public AnnotatedParameter getConstructorParameter() { return (_member instanceof AnnotatedParameter) ? (AnnotatedParameter) _member : null; } /** * Method used to find accessor (getter, field to access) to use for accessing * value of the property. * Null if no such member exists. */ @Override public AnnotatedMember getAccessor() { AnnotatedMember acc = getGetter(); if (acc == null) { acc = getField(); } return acc; } /** * Method used to find mutator (constructor parameter, setter, field) to use for * changing value of the property. * Null if no such member exists. */ @Override public AnnotatedMember getMutator() { AnnotatedMember acc = getConstructorParameter(); if (acc == null) { acc = getSetter(); if (acc == null) { acc = getField(); } } return acc; } @Override public AnnotatedMember getPrimaryMember() { return _member; } }