1 package com.fasterxml.jackson.databind;
2
3 import com.fasterxml.jackson.annotation.Nulls;
4 import com.fasterxml.jackson.databind.introspect.AnnotatedMember;
5
6
14 public class PropertyMetadata
15 implements java.io.Serializable
16 {
17 private static final long serialVersionUID = -1;
18
19 public final static PropertyMetadata STD_REQUIRED = new PropertyMetadata(Boolean.TRUE,
20 null, null, null, null, null, null);
21
22 public final static PropertyMetadata STD_OPTIONAL = new PropertyMetadata(Boolean.FALSE,
23 null, null, null, null, null, null);
24
25 public final static PropertyMetadata STD_REQUIRED_OR_OPTIONAL = new PropertyMetadata(null,
26 null, null, null, null, null, null);
27
28
34 public final static class MergeInfo
35
36 {
37 public final AnnotatedMember getter;
38
39
44 public final boolean fromDefaults;
45
46 protected MergeInfo(AnnotatedMember getter, boolean fromDefaults) {
47 this.getter = getter;
48 this.fromDefaults = fromDefaults;
49 }
50
51 public static MergeInfo createForDefaults(AnnotatedMember getter) {
52 return new MergeInfo(getter, true);
53 }
54
55 public static MergeInfo createForTypeOverride(AnnotatedMember getter) {
56 return new MergeInfo(getter, false);
57 }
58
59 public static MergeInfo createForPropertyOverride(AnnotatedMember getter) {
60 return new MergeInfo(getter, false);
61 }
62 }
63
64
68 protected final Boolean _required;
69
70
73 protected final String _description;
74
75
80 protected final Integer _index;
81
82
87 protected final String _defaultValue;
88
89
100 protected final transient MergeInfo _mergeInfo;
101
102
109 protected Nulls _valueNulls, _contentNulls;
110
111
116
117
120 protected PropertyMetadata(Boolean req, String desc, Integer index, String def,
121 MergeInfo mergeInfo, Nulls valueNulls, Nulls contentNulls)
122 {
123 _required = req;
124 _description = desc;
125 _index = index;
126 _defaultValue = (def == null || def.isEmpty()) ? null : def;
127 _mergeInfo = mergeInfo;
128 _valueNulls = valueNulls;
129 _contentNulls = contentNulls;
130 }
131
132
135 public static PropertyMetadata construct(Boolean req, String desc, Integer index,
136 String defaultValue) {
137 if ((desc != null) || (index != null) || (defaultValue != null)) {
138 return new PropertyMetadata(req, desc, index, defaultValue,
139 null, null, null);
140 }
141 if (req == null) {
142 return STD_REQUIRED_OR_OPTIONAL;
143 }
144 return req ? STD_REQUIRED : STD_OPTIONAL;
145 }
146
147 @Deprecated
148 public static PropertyMetadata construct(boolean req, String desc, Integer index,
149 String defaultValue) {
150 if (desc != null || index != null || defaultValue != null) {
151 return new PropertyMetadata(req, desc, index, defaultValue,
152 null, null, null);
153 }
154 return req ? STD_REQUIRED : STD_OPTIONAL;
155 }
156
157
161 protected Object readResolve()
162 {
163 if ((_description == null) && (_index == null) && (_defaultValue == null)
164 && (_mergeInfo == null)
165 && (_valueNulls == null) && (_contentNulls == null)) {
166 if (_required == null) {
167 return STD_REQUIRED_OR_OPTIONAL;
168 }
169 return _required.booleanValue() ? STD_REQUIRED : STD_OPTIONAL;
170 }
171 return this;
172 }
173
174 public PropertyMetadata withDescription(String desc) {
175 return new PropertyMetadata(_required, desc, _index, _defaultValue,
176 _mergeInfo, _valueNulls, _contentNulls);
177 }
178
179
182 public PropertyMetadata withMergeInfo(MergeInfo mergeInfo) {
183 return new PropertyMetadata(_required, _description, _index, _defaultValue,
184 mergeInfo, _valueNulls, _contentNulls);
185 }
186
187
190 public PropertyMetadata withNulls(Nulls valueNulls,
191 Nulls contentNulls) {
192 return new PropertyMetadata(_required, _description, _index, _defaultValue,
193 _mergeInfo, valueNulls, contentNulls);
194 }
195
196 public PropertyMetadata withDefaultValue(String def) {
197 if ((def == null) || def.isEmpty()) {
198 if (_defaultValue == null) {
199 return this;
200 }
201 def = null;
202 } else if (def.equals(_defaultValue)) {
203 return this;
204 }
205 return new PropertyMetadata(_required, _description, _index, def,
206 _mergeInfo, _valueNulls, _contentNulls);
207 }
208
209 public PropertyMetadata withIndex(Integer index) {
210 return new PropertyMetadata(_required, _description, index, _defaultValue,
211 _mergeInfo, _valueNulls, _contentNulls);
212 }
213
214 public PropertyMetadata withRequired(Boolean b) {
215 if (b == null) {
216 if (_required == null) {
217 return this;
218 }
219 } else if (b.equals(_required)) {
220 return this;
221 }
222 return new PropertyMetadata(b, _description, _index, _defaultValue,
223 _mergeInfo, _valueNulls, _contentNulls);
224 }
225
226
231
232 public String getDescription() { return _description; }
233
234
237 public String getDefaultValue() { return _defaultValue; }
238
239
245 public boolean hasDefaultValue() { return (_defaultValue != null); }
246
247 public boolean isRequired() { return (_required != null) && _required.booleanValue(); }
248
249 public Boolean getRequired() { return _required; }
250
251
254 public Integer getIndex() { return _index; }
255
256
259 public boolean hasIndex() { return _index != null; }
260
261
264 public MergeInfo getMergeInfo() { return _mergeInfo; }
265
266
269 public Nulls getValueNulls() { return _valueNulls; }
270
271
274 public Nulls getContentNulls() { return _contentNulls; }
275 }
276