package sh.calaba.org.codehaus.jackson.map.ser.std; import java.io.IOException; import java.util.Iterator; import sh.calaba.org.codehaus.jackson.JsonGenerationException; import sh.calaba.org.codehaus.jackson.JsonGenerator; import sh.calaba.org.codehaus.jackson.map.BeanProperty; import sh.calaba.org.codehaus.jackson.map.JsonSerializer; import sh.calaba.org.codehaus.jackson.map.SerializerProvider; import sh.calaba.org.codehaus.jackson.map.TypeSerializer; import sh.calaba.org.codehaus.jackson.map.annotate.JacksonStdImpl; import sh.calaba.org.codehaus.jackson.type.JavaType; @JacksonStdImpl public class IterableSerializer extends AsArraySerializerBase<Iterable<?>> { public IterableSerializer(JavaType elemType, boolean staticTyping, TypeSerializer vts, BeanProperty property) { super(Iterable.class, elemType, staticTyping, vts, property, null); } @Override public ContainerSerializerBase<?> _withValueTypeSerializer(TypeSerializer vts) { return new IterableSerializer(_elementType, _staticTyping, vts, _property); } @Override public void serializeContents(Iterable<?> value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonGenerationException { Iterator<?> it = value.iterator(); if (it.hasNext()) { final TypeSerializer typeSer = _valueTypeSerializer; JsonSerializer<Object> prevSerializer = null; Class<?> prevClass = null; do { Object elem = it.next(); if (elem == null) { provider.defaultSerializeNull(jgen); } else { // Minor optimization to avoid most lookups: Class<?> cc = elem.getClass(); JsonSerializer<Object> currSerializer; if (cc == prevClass) { currSerializer = prevSerializer; } else { currSerializer = provider.findValueSerializer(cc, _property); prevSerializer = currSerializer; prevClass = cc; } if (typeSer == null) { currSerializer.serialize(elem, jgen, provider); } else { currSerializer.serializeWithType(elem, jgen, provider, typeSer); } } } while (it.hasNext()); } } }