All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.fasterxml.jackson.module.scala.ser.IteratorSerializerModule.scala Maven / Gradle / Ivy

The newest version!
package com.fasterxml.jackson.module.scala.ser

import scala.collection.JavaConverters._

import com.fasterxml.jackson.core.JsonGenerator;

import com.fasterxml.jackson.databind._
import com.fasterxml.jackson.databind.`type`.CollectionLikeType
import com.fasterxml.jackson.databind.jsontype.TypeSerializer
import com.fasterxml.jackson.databind.ser.Serializers
import com.fasterxml.jackson.databind.ser.std.AsArraySerializerBase
import com.fasterxml.jackson.databind.ser.impl.IteratorSerializer

import com.fasterxml.jackson.module.scala.modifiers.IteratorTypeModifierModule

private class ScalaIteratorSerializer(seqType: Class[_],
				      elemType: JavaType,
				      staticTyping: Boolean,
				      vts: Option[TypeSerializer],
				      property: BeanProperty,
				      valueSerializer: Option[JsonSerializer[AnyRef]]) extends
AsArraySerializerBase[collection.Iterator[Any]](seqType, elemType,
                                                staticTyping, vts.orNull,
                                                property,
                                                valueSerializer.orNull) {
  
  def hasSingleElement(p1: collection.Iterator[Any]) = false
  
  val iteratorSerializer = {
    // TODO: this looks weird, but there is no matching constructor in                                                                                                                                       
    // IteratorSerializer                                                                                                                                                                                    
    val s1 = new IteratorSerializer(elemType, staticTyping, vts.orNull, property)
    if (valueSerializer.isDefined) {
      s1.withResolved(property, vts.orNull, valueSerializer.orNull)
    }
    s1
  }

  def serializeContents(value: collection.Iterator[Any], jgen: JsonGenerator, provider: SerializerProvider) {
    iteratorSerializer.serializeContents(value.asJava, jgen, provider)
  }

  override def _withValueTypeSerializer(newVts: TypeSerializer) =
    withResolved(property, newVts, valueSerializer.asInstanceOf[JsonSerializer[_]])
  
  override def withResolved(newProperty: BeanProperty, newVts: TypeSerializer, elementSerializer: JsonSerializer[_]) =
    new ScalaIteratorSerializer(seqType, elemType, staticTyping, Option(newVts), newProperty, Option(elementSerializer.asInstanceOf[JsonSerializer[AnyRef]]))
  
  override def isEmpty(value: collection.Iterator[Any]): Boolean = value.hasNext
}

private object ScalaIteratorSerializerResolver extends Serializers.Base {
  override def findCollectionLikeSerializer(config: SerializationConfig,
                                            collectionType: CollectionLikeType,
                                            beanDescription: BeanDescription,
                                            elementTypeSerializer: TypeSerializer,
                                            elementSerializer: JsonSerializer[Object]): JsonSerializer[_] = {
    
    val rawClass = collectionType.getRawClass
    if (classOf[collection.Iterator[Any]].isAssignableFrom(rawClass))
      new ScalaIteratorSerializer(rawClass, collectionType.containedType(0),
                                  false, Option(elementTypeSerializer), null,
                                  Option(elementSerializer))
    else
      null
  }
}

trait IteratorSerializerModule extends IteratorTypeModifierModule {
  this += ScalaIteratorSerializerResolver
}






© 2015 - 2025 Weber Informatics LLC | Privacy Policy