1 package com.fasterxml.jackson.databind.ser.std;
2
3 import java.io.IOException;
4 import java.lang.reflect.Type;
5 import java.util.*;
6
7 import com.fasterxml.jackson.annotation.*;
8
9 import com.fasterxml.jackson.core.*;
10 import com.fasterxml.jackson.core.type.WritableTypeId;
11
12 import com.fasterxml.jackson.databind.*;
13 import com.fasterxml.jackson.databind.introspect.AnnotatedMember;
14 import com.fasterxml.jackson.databind.introspect.ObjectIdInfo;
15 import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonFormatVisitable;
16 import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonFormatVisitorWrapper;
17 import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonObjectFormatVisitor;
18 import com.fasterxml.jackson.databind.jsonschema.JsonSerializableSchema;
19 import com.fasterxml.jackson.databind.jsonschema.SchemaAware;
20 import com.fasterxml.jackson.databind.jsontype.TypeSerializer;
21 import com.fasterxml.jackson.databind.node.ObjectNode;
22 import com.fasterxml.jackson.databind.ser.*;
23 import com.fasterxml.jackson.databind.ser.impl.MapEntrySerializer;
24 import com.fasterxml.jackson.databind.ser.impl.ObjectIdWriter;
25 import com.fasterxml.jackson.databind.ser.impl.PropertyBasedObjectIdGenerator;
26 import com.fasterxml.jackson.databind.ser.impl.WritableObjectId;
27 import com.fasterxml.jackson.databind.util.ArrayBuilders;
28 import com.fasterxml.jackson.databind.util.Converter;
29 import com.fasterxml.jackson.databind.util.NameTransformer;
30
31
37 @SuppressWarnings("serial")
38 public abstract class BeanSerializerBase
39 extends StdSerializer<Object>
40 implements ContextualSerializer, ResolvableSerializer,
41 JsonFormatVisitable, SchemaAware
42 {
43 protected final static PropertyName NAME_FOR_OBJECT_REF = new PropertyName("#object-ref");
44
45 final protected static BeanPropertyWriter[] NO_PROPS = new BeanPropertyWriter[0];
46
47
52
53
56 final protected JavaType _beanType;
57
58
61 final protected BeanPropertyWriter[] _props;
62
63
67 final protected BeanPropertyWriter[] _filteredProps;
68
69
73 final protected AnyGetterWriter _anyGetterWriter;
74
75
78 final protected Object _propertyFilterId;
79
80
84 final protected AnnotatedMember _typeId;
85
86
91 final protected ObjectIdWriter _objectIdWriter;
92
93
96 final protected JsonFormat.Shape _serializationShape;
97
98
103
104
111 protected BeanSerializerBase(JavaType type, BeanSerializerBuilder builder,
112 BeanPropertyWriter[] properties, BeanPropertyWriter[] filteredProperties)
113 {
114 super(type);
115 _beanType = type;
116 _props = properties;
117 _filteredProps = filteredProperties;
118 if (builder == null) {
119
120
121 _typeId = null;
122 _anyGetterWriter = null;
123 _propertyFilterId = null;
124 _objectIdWriter = null;
125 _serializationShape = null;
126 } else {
127 _typeId = builder.getTypeId();
128 _anyGetterWriter = builder.getAnyGetter();
129 _propertyFilterId = builder.getFilterId();
130 _objectIdWriter = builder.getObjectIdWriter();
131 JsonFormat.Value format = builder.getBeanDescription().findExpectedFormat(null);
132 _serializationShape = (format == null) ? null : format.getShape();
133 }
134 }
135
136 protected BeanSerializerBase(BeanSerializerBase src,
137 BeanPropertyWriter[] properties, BeanPropertyWriter[] filteredProperties)
138 {
139 super(src._handledType);
140 _beanType = src._beanType;
141 _props = properties;
142 _filteredProps = filteredProperties;
143
144 _typeId = src._typeId;
145 _anyGetterWriter = src._anyGetterWriter;
146 _objectIdWriter = src._objectIdWriter;
147 _propertyFilterId = src._propertyFilterId;
148 _serializationShape = src._serializationShape;
149 }
150
151 protected BeanSerializerBase(BeanSerializerBase src,
152 ObjectIdWriter objectIdWriter)
153 {
154 this(src, objectIdWriter, src._propertyFilterId);
155 }
156
157
160 protected BeanSerializerBase(BeanSerializerBase src,
161 ObjectIdWriter objectIdWriter, Object filterId)
162 {
163 super(src._handledType);
164 _beanType = src._beanType;
165 _props = src._props;
166 _filteredProps = src._filteredProps;
167
168 _typeId = src._typeId;
169 _anyGetterWriter = src._anyGetterWriter;
170 _objectIdWriter = objectIdWriter;
171 _propertyFilterId = filterId;
172 _serializationShape = src._serializationShape;
173 }
174
175 @Deprecated
176 protected BeanSerializerBase(BeanSerializerBase src, String[] toIgnore)
177 {
178 this(src, ArrayBuilders.arrayToSet(toIgnore));
179 }
180
181 protected BeanSerializerBase(BeanSerializerBase src, Set<String> toIgnore)
182 {
183 super(src._handledType);
184
185 _beanType = src._beanType;
186 final BeanPropertyWriter[] propsIn = src._props;
187 final BeanPropertyWriter[] fpropsIn = src._filteredProps;
188 final int len = propsIn.length;
189
190 ArrayList<BeanPropertyWriter> propsOut = new ArrayList<BeanPropertyWriter>(len);
191 ArrayList<BeanPropertyWriter> fpropsOut = (fpropsIn == null) ? null : new ArrayList<BeanPropertyWriter>(len);
192
193 for (int i = 0; i < len; ++i) {
194 BeanPropertyWriter bpw = propsIn[i];
195
196 if ((toIgnore != null) && toIgnore.contains(bpw.getName())) {
197 continue;
198 }
199 propsOut.add(bpw);
200 if (fpropsIn != null) {
201 fpropsOut.add(fpropsIn[i]);
202 }
203 }
204 _props = propsOut.toArray(new BeanPropertyWriter[propsOut.size()]);
205 _filteredProps = (fpropsOut == null) ? null : fpropsOut.toArray(new BeanPropertyWriter[fpropsOut.size()]);
206
207 _typeId = src._typeId;
208 _anyGetterWriter = src._anyGetterWriter;
209 _objectIdWriter = src._objectIdWriter;
210 _propertyFilterId = src._propertyFilterId;
211 _serializationShape = src._serializationShape;
212 }
213
214
220 public abstract BeanSerializerBase withObjectIdWriter(ObjectIdWriter objectIdWriter);
221
222
228 protected abstract BeanSerializerBase withIgnorals(Set<String> toIgnore);
229
230
236 @Deprecated
237 protected BeanSerializerBase withIgnorals(String[] toIgnore) {
238 return withIgnorals(ArrayBuilders.arrayToSet(toIgnore));
239 }
240
241
248 protected abstract BeanSerializerBase asArraySerializer();
249
250
256 @Override
257 public abstract BeanSerializerBase withFilterId(Object filterId);
258
259
268 protected BeanSerializerBase withProperties(BeanPropertyWriter[] properties,
269 BeanPropertyWriter[] filteredProperties) {
270 return this;
271 }
272
273
274
275
276
277
281 protected BeanSerializerBase(BeanSerializerBase src) {
282 this(src, src._props, src._filteredProps);
283 }
284
285
289 protected BeanSerializerBase(BeanSerializerBase src, NameTransformer unwrapper) {
290 this(src, rename(src._props, unwrapper), rename(src._filteredProps, unwrapper));
291 }
292
293 private final static BeanPropertyWriter[] rename(BeanPropertyWriter[] props,
294 NameTransformer transformer)
295 {
296 if (props == null || props.length == 0 || transformer == null || transformer == NameTransformer.NOP) {
297 return props;
298 }
299 final int len = props.length;
300 BeanPropertyWriter[] result = new BeanPropertyWriter[len];
301 for (int i = 0; i < len; ++i) {
302 BeanPropertyWriter bpw = props[i];
303 if (bpw != null) {
304 result[i] = bpw.rename(transformer);
305 }
306 }
307 return result;
308 }
309
310
315
316
320 @Override
321 public void resolve(SerializerProvider provider)
322 throws JsonMappingException
323 {
324 int filteredCount = (_filteredProps == null) ? 0 : _filteredProps.length;
325 for (int i = 0, len = _props.length; i < len; ++i) {
326 BeanPropertyWriter prop = _props[i];
327
328 if (!prop.willSuppressNulls() && !prop.hasNullSerializer()) {
329 JsonSerializer<Object> nullSer = provider.findNullValueSerializer(prop);
330 if (nullSer != null) {
331 prop.assignNullSerializer(nullSer);
332
333 if (i < filteredCount) {
334 BeanPropertyWriter w2 = _filteredProps[i];
335 if (w2 != null) {
336 w2.assignNullSerializer(nullSer);
337 }
338 }
339 }
340 }
341
342 if (prop.hasSerializer()) {
343 continue;
344 }
345
346 JsonSerializer<Object> ser = findConvertingSerializer(provider, prop);
347 if (ser == null) {
348
349 JavaType type = prop.getSerializationType();
350
351
352
353 if (type == null) {
354 type = prop.getType();
355 if (!type.isFinal()) {
356 if (type.isContainerType() || type.containedTypeCount() > 0) {
357 prop.setNonTrivialBaseType(type);
358 }
359 continue;
360 }
361 }
362 ser = provider.findValueSerializer(type, prop);
363
364
365 if (type.isContainerType()) {
366 TypeSerializer typeSer = type.getContentType().getTypeHandler();
367 if (typeSer != null) {
368
369 if (ser instanceof ContainerSerializer<?>) {
370
371 @SuppressWarnings("unchecked")
372 JsonSerializer<Object> ser2 = (JsonSerializer<Object>)((ContainerSerializer<?>) ser).withValueTypeSerializer(typeSer);
373 ser = ser2;
374 }
375 }
376 }
377 }
378
379 if (i < filteredCount) {
380 BeanPropertyWriter w2 = _filteredProps[i];
381 if (w2 != null) {
382 w2.assignSerializer(ser);
383
384
385
386 continue;
387 }
388 }
389 prop.assignSerializer(ser);
390 }
391
392
393 if (_anyGetterWriter != null) {
394
395 _anyGetterWriter.resolve(provider);
396 }
397 }
398
399
406 protected JsonSerializer<Object> findConvertingSerializer(SerializerProvider provider,
407 BeanPropertyWriter prop)
408 throws JsonMappingException
409 {
410 final AnnotationIntrospector intr = provider.getAnnotationIntrospector();
411 if (intr != null) {
412 AnnotatedMember m = prop.getMember();
413 if (m != null) {
414 Object convDef = intr.findSerializationConverter(m);
415 if (convDef != null) {
416 Converter<Object,Object> conv = provider.converterInstance(prop.getMember(), convDef);
417 JavaType delegateType = conv.getOutputType(provider.getTypeFactory());
418
419 JsonSerializer<?> ser = delegateType.isJavaLangObject() ? null
420 : provider.findValueSerializer(delegateType, prop);
421 return new StdDelegatingSerializer(conv, delegateType, ser);
422 }
423 }
424 }
425 return null;
426 }
427
428 @SuppressWarnings("incomplete-switch")
429 @Override
430 public JsonSerializer<?> createContextual(SerializerProvider provider,
431 BeanProperty property)
432 throws JsonMappingException
433 {
434 final AnnotationIntrospector intr = provider.getAnnotationIntrospector();
435 final AnnotatedMember accessor = (property == null || intr == null)
436 ? null : property.getMember();
437 final SerializationConfig config = provider.getConfig();
438
439
440
441 JsonFormat.Value format = findFormatOverrides(provider, property, _handledType);
442 JsonFormat.Shape shape = null;
443 if ((format != null) && format.hasShape()) {
444 shape = format.getShape();
445
446 if ((shape != JsonFormat.Shape.ANY) && (shape != _serializationShape)) {
447 if (_beanType.isEnumType()) {
448 switch (shape) {
449 case STRING:
450 case NUMBER:
451 case NUMBER_INT:
452
453
454 BeanDescription desc = config.introspectClassAnnotations(_beanType);
455 JsonSerializer<?> ser = EnumSerializer.construct(_beanType.getRawClass(),
456 provider.getConfig(), desc, format);
457 return provider.handlePrimaryContextualization(ser, property);
458 }
459
460 } else if (shape == JsonFormat.Shape.NATURAL) {
461 if (_beanType.isMapLikeType() && Map.class.isAssignableFrom(_handledType)) {
462 ;
463 } else if (Map.Entry.class.isAssignableFrom(_handledType)) {
464 JavaType mapEntryType = _beanType.findSuperType(Map.Entry.class);
465
466 JavaType kt = mapEntryType.containedTypeOrUnknown(0);
467 JavaType vt = mapEntryType.containedTypeOrUnknown(1);
468
469
470
471 JsonSerializer<?> ser = new MapEntrySerializer(_beanType, kt, vt,
472 false, null, property);
473 return provider.handlePrimaryContextualization(ser, property);
474 }
475 }
476 }
477 }
478
479 ObjectIdWriter oiw = _objectIdWriter;
480
481
482
483 int idPropOrigIndex = 0;
484 Set<String> ignoredProps = null;
485 Object newFilterId = null;
486
487
488 if (accessor != null) {
489 JsonIgnoreProperties.Value ignorals = intr.findPropertyIgnorals(accessor);
490 if (ignorals != null) {
491 ignoredProps = ignorals.findIgnoredForSerialization();
492 }
493 ObjectIdInfo objectIdInfo = intr.findObjectIdInfo(accessor);
494 if (objectIdInfo == null) {
495
496 if (oiw != null) {
497 objectIdInfo = intr.findObjectReferenceInfo(accessor, null);
498 if (objectIdInfo != null) {
499 oiw = _objectIdWriter.withAlwaysAsId(objectIdInfo.getAlwaysAsId());
500 }
501 }
502 } else {
503
504
505
506
507 objectIdInfo = intr.findObjectReferenceInfo(accessor, objectIdInfo);
508 Class<?> implClass = objectIdInfo.getGeneratorType();
509 JavaType type = provider.constructType(implClass);
510 JavaType idType = provider.getTypeFactory().findTypeParameters(type, ObjectIdGenerator.class)[0];
511
512 if (implClass == ObjectIdGenerators.PropertyGenerator.class) {
513 String propName = objectIdInfo.getPropertyName().getSimpleName();
514 BeanPropertyWriter idProp = null;
515
516 for (int i = 0, len = _props.length; ; ++i) {
517 if (i == len) {
518 provider.reportBadDefinition(_beanType, String.format(
519 "Invalid Object Id definition for %s: cannot find property with name '%s'",
520 handledType().getName(), propName));
521 }
522 BeanPropertyWriter prop = _props[i];
523 if (propName.equals(prop.getName())) {
524 idProp = prop;
525
526
527 idPropOrigIndex = i;
528 break;
529 }
530 }
531 idType = idProp.getType();
532 ObjectIdGenerator<?> gen = new PropertyBasedObjectIdGenerator(objectIdInfo, idProp);
533 oiw = ObjectIdWriter.construct(idType, (PropertyName) null, gen, objectIdInfo.getAlwaysAsId());
534 } else {
535 ObjectIdGenerator<?> gen = provider.objectIdGeneratorInstance(accessor, objectIdInfo);
536 oiw = ObjectIdWriter.construct(idType, objectIdInfo.getPropertyName(), gen,
537 objectIdInfo.getAlwaysAsId());
538 }
539 }
540
541 Object filterId = intr.findFilterId(accessor);
542 if (filterId != null) {
543
544 if (_propertyFilterId == null || !filterId.equals(_propertyFilterId)) {
545 newFilterId = filterId;
546 }
547 }
548 }
549
550 BeanSerializerBase contextual = this;
551
552
553 if (idPropOrigIndex > 0) {
554 final BeanPropertyWriter[] newProps = Arrays.copyOf(_props, _props.length);
555 BeanPropertyWriter bpw = newProps[idPropOrigIndex];
556 System.arraycopy(newProps, 0, newProps, 1, idPropOrigIndex);
557 newProps[0] = bpw;
558 final BeanPropertyWriter[] newFiltered;
559 if (_filteredProps == null) {
560 newFiltered = null;
561 } else {
562 newFiltered = Arrays.copyOf(_filteredProps, _filteredProps.length);
563 bpw = newFiltered[idPropOrigIndex];
564 System.arraycopy(newFiltered, 0, newFiltered, 1, idPropOrigIndex);
565 newFiltered[0] = bpw;
566 }
567 contextual = contextual.withProperties(newProps, newFiltered);
568 }
569
570 if (oiw != null) {
571 JsonSerializer<?> ser = provider.findValueSerializer(oiw.idType, property);
572 oiw = oiw.withSerializer(ser);
573 if (oiw != _objectIdWriter) {
574 contextual = contextual.withObjectIdWriter(oiw);
575 }
576 }
577
578 if ((ignoredProps != null) && !ignoredProps.isEmpty()) {
579 contextual = contextual.withIgnorals(ignoredProps);
580 }
581 if (newFilterId != null) {
582 contextual = contextual.withFilterId(newFilterId);
583 }
584
585 if (shape == null) {
586 shape = _serializationShape;
587 }
588
589 if (shape == JsonFormat.Shape.ARRAY) {
590 return contextual.asArraySerializer();
591 }
592 return contextual;
593 }
594
595
600
601 @Override
602 public Iterator<PropertyWriter> properties() {
603 return Arrays.<PropertyWriter>asList(_props).iterator();
604 }
605
606
611
612 @Override
613 public boolean usesObjectId() {
614 return (_objectIdWriter != null);
615 }
616
617
618 @Override
619 public abstract void serialize(Object bean, JsonGenerator gen, SerializerProvider provider)
620 throws IOException;
621
622
623 @Override
624 public void serializeWithType(Object bean, JsonGenerator gen,
625 SerializerProvider provider, TypeSerializer typeSer)
626 throws IOException
627 {
628 if (_objectIdWriter != null) {
629 gen.setCurrentValue(bean);
630 _serializeWithObjectId(bean, gen, provider, typeSer);
631 return;
632 }
633
634 gen.setCurrentValue(bean);
635 WritableTypeId typeIdDef = _typeIdDef(typeSer, bean, JsonToken.START_OBJECT);
636 typeSer.writeTypePrefix(gen, typeIdDef);
637 if (_propertyFilterId != null) {
638 serializeFieldsFiltered(bean, gen, provider);
639 } else {
640 serializeFields(bean, gen, provider);
641 }
642 typeSer.writeTypeSuffix(gen, typeIdDef);
643 }
644
645 protected final void _serializeWithObjectId(Object bean, JsonGenerator gen, SerializerProvider provider,
646 boolean startEndObject) throws IOException
647 {
648 final ObjectIdWriter w = _objectIdWriter;
649 WritableObjectId objectId = provider.findObjectId(bean, w.generator);
650
651 if (objectId.writeAsId(gen, provider, w)) {
652 return;
653 }
654
655 Object id = objectId.generateId(bean);
656 if (w.alwaysAsId) {
657 w.serializer.serialize(id, gen, provider);
658 return;
659 }
660 if (startEndObject) {
661 gen.writeStartObject(bean);
662 }
663 objectId.writeAsField(gen, provider, w);
664 if (_propertyFilterId != null) {
665 serializeFieldsFiltered(bean, gen, provider);
666 } else {
667 serializeFields(bean, gen, provider);
668 }
669 if (startEndObject) {
670 gen.writeEndObject();
671 }
672 }
673
674 protected final void _serializeWithObjectId(Object bean, JsonGenerator gen, SerializerProvider provider,
675 TypeSerializer typeSer) throws IOException
676 {
677 final ObjectIdWriter w = _objectIdWriter;
678 WritableObjectId objectId = provider.findObjectId(bean, w.generator);
679
680 if (objectId.writeAsId(gen, provider, w)) {
681 return;
682 }
683
684 Object id = objectId.generateId(bean);
685 if (w.alwaysAsId) {
686 w.serializer.serialize(id, gen, provider);
687 return;
688 }
689 _serializeObjectId(bean, gen, provider, typeSer, objectId);
690 }
691
692 protected void _serializeObjectId(Object bean, JsonGenerator g,
693 SerializerProvider provider,
694 TypeSerializer typeSer, WritableObjectId objectId) throws IOException
695 {
696 final ObjectIdWriter w = _objectIdWriter;
697 WritableTypeId typeIdDef = _typeIdDef(typeSer, bean, JsonToken.START_OBJECT);
698
699 typeSer.writeTypePrefix(g, typeIdDef);
700 objectId.writeAsField(g, provider, w);
701 if (_propertyFilterId != null) {
702 serializeFieldsFiltered(bean, g, provider);
703 } else {
704 serializeFields(bean, g, provider);
705 }
706 typeSer.writeTypeSuffix(g, typeIdDef);
707 }
708
709
712 protected final WritableTypeId _typeIdDef(TypeSerializer typeSer,
713 Object bean, JsonToken valueShape) {
714 if (_typeId == null) {
715 return typeSer.typeId(bean, valueShape);
716 }
717 Object typeId = _typeId.getValue(bean);
718 if (typeId == null) {
719
720 typeId = "";
721 }
722 return typeSer.typeId(bean, valueShape, typeId);
723 }
724
725 @Deprecated
726 protected final String _customTypeId(Object bean)
727 {
728 final Object typeId = _typeId.getValue(bean);
729 if (typeId == null) {
730 return "";
731 }
732 return (typeId instanceof String) ? (String) typeId : typeId.toString();
733 }
734
735
740
741 protected void serializeFields(Object bean, JsonGenerator gen, SerializerProvider provider)
742 throws IOException
743 {
744 final BeanPropertyWriter[] props;
745 if (_filteredProps != null && provider.getActiveView() != null) {
746 props = _filteredProps;
747 } else {
748 props = _props;
749 }
750 int i = 0;
751 try {
752 for (final int len = props.length; i < len; ++i) {
753 BeanPropertyWriter prop = props[i];
754 if (prop != null) {
755 prop.serializeAsField(bean, gen, provider);
756 }
757 }
758 if (_anyGetterWriter != null) {
759 _anyGetterWriter.getAndSerialize(bean, gen, provider);
760 }
761 } catch (Exception e) {
762 String name = (i == props.length) ? "[anySetter]" : props[i].getName();
763 wrapAndThrow(provider, e, bean, name);
764 } catch (StackOverflowError e) {
765
766
767
768
769
770 JsonMappingException mapE = new JsonMappingException(gen, "Infinite recursion (StackOverflowError)", e);
771
772 String name = (i == props.length) ? "[anySetter]" : props[i].getName();
773 mapE.prependPath(new JsonMappingException.Reference(bean, name));
774 throw mapE;
775 }
776 }
777
778
783 protected void serializeFieldsFiltered(Object bean, JsonGenerator gen,
784 SerializerProvider provider)
785 throws IOException, JsonGenerationException
786 {
787
790 final BeanPropertyWriter[] props;
791 if (_filteredProps != null && provider.getActiveView() != null) {
792 props = _filteredProps;
793 } else {
794 props = _props;
795 }
796 final PropertyFilter filter = findPropertyFilter(provider, _propertyFilterId, bean);
797
798 if (filter == null) {
799 serializeFields(bean, gen, provider);
800 return;
801 }
802 int i = 0;
803 try {
804 for (final int len = props.length; i < len; ++i) {
805 BeanPropertyWriter prop = props[i];
806 if (prop != null) {
807 filter.serializeAsField(bean, gen, provider, prop);
808 }
809 }
810 if (_anyGetterWriter != null) {
811 _anyGetterWriter.getAndFilter(bean, gen, provider, filter);
812 }
813 } catch (Exception e) {
814 String name = (i == props.length) ? "[anySetter]" : props[i].getName();
815 wrapAndThrow(provider, e, bean, name);
816 } catch (StackOverflowError e) {
817
818
819 JsonMappingException mapE = new JsonMappingException(gen, "Infinite recursion (StackOverflowError)", e);
820 String name = (i == props.length) ? "[anySetter]" : props[i].getName();
821 mapE.prependPath(new JsonMappingException.Reference(bean, name));
822 throw mapE;
823 }
824 }
825
826 @Deprecated
827 @Override
828 public JsonNode getSchema(SerializerProvider provider, Type typeHint)
829 throws JsonMappingException
830 {
831 ObjectNode o = createSchemaNode("object", true);
832
833
834 JsonSerializableSchema ann = _handledType.getAnnotation(JsonSerializableSchema.class);
835 if (ann != null) {
836 String id = ann.id();
837 if (id != null && id.length() > 0) {
838 o.put("id", id);
839 }
840 }
841
842
843
844 ObjectNode propertiesNode = o.objectNode();
845 final PropertyFilter filter;
846 if (_propertyFilterId != null) {
847 filter = findPropertyFilter(provider, _propertyFilterId, null);
848 } else {
849 filter = null;
850 }
851
852 for (int i = 0; i < _props.length; i++) {
853 BeanPropertyWriter prop = _props[i];
854 if (filter == null) {
855 prop.depositSchemaProperty(propertiesNode, provider);
856 } else {
857 filter.depositSchemaProperty(prop, propertiesNode, provider);
858 }
859
860 }
861 o.set("properties", propertiesNode);
862 return o;
863 }
864
865 @Override
866 public void acceptJsonFormatVisitor(JsonFormatVisitorWrapper visitor, JavaType typeHint)
867 throws JsonMappingException
868 {
869
870 if (visitor == null) {
871 return;
872 }
873 JsonObjectFormatVisitor objectVisitor = visitor.expectObjectFormat(typeHint);
874 if (objectVisitor == null) {
875 return;
876 }
877 final SerializerProvider provider = visitor.getProvider();
878 if (_propertyFilterId != null) {
879 PropertyFilter filter = findPropertyFilter(visitor.getProvider(),
880 _propertyFilterId, null);
881 for (int i = 0, end = _props.length; i < end; ++i) {
882 filter.depositSchemaProperty(_props[i], objectVisitor, provider);
883 }
884 } else {
885 Class<?> view = ((_filteredProps == null) || (provider == null))
886 ? null : provider.getActiveView();
887 final BeanPropertyWriter[] props;
888 if (view != null) {
889 props = _filteredProps;
890 } else {
891 props = _props;
892 }
893
894 for (int i = 0, end = props.length; i < end; ++i) {
895 BeanPropertyWriter prop = props[i];
896 if (prop != null) {
897 prop.depositSchemaProperty(objectVisitor, provider);
898 }
899 }
900 }
901 }
902 }
903