Skip to content

Commit

Permalink
Case class inclusion. Fix FasterXML#32, FasterXML#45
Browse files Browse the repository at this point in the history
  • Loading branch information
christophercurrie committed Oct 26, 2012
1 parent 22faad9 commit a6849b1
Showing 1 changed file with 18 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,10 @@ import java.{util => ju}

import org.scalastuff.scalabeans.ConstructorParameter

import com.fasterxml.jackson.databind.{PropertyName, BeanDescription, PropertyNamingStrategy, SerializationConfig}
;
import com.fasterxml.jackson.databind.ser.{BeanPropertyWriter, BeanSerializerModifier};
import com.fasterxml.jackson.annotation.{JsonInclude, JsonIgnore}
import com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL
import com.fasterxml.jackson.databind.{PropertyName, BeanDescription, SerializationConfig}
import com.fasterxml.jackson.databind.ser.{BeanPropertyWriter, BeanSerializerModifier}
import com.fasterxml.jackson.databind.introspect.AnnotatedMethod
import com.fasterxml.jackson.databind.util.SimpleBeanPropertyDefinition
import com.fasterxml.jackson.module.scala.JacksonModule
Expand All @@ -22,30 +23,36 @@ private object CaseClassBeanSerializerModifier extends BeanSerializerModifier {
beanDesc: BeanDescription,
beanProperties: ju.List[BeanPropertyWriter]): ju.List[BeanPropertyWriter] = {
val jacksonIntrospector = config.getAnnotationIntrospector
val defaultInclusion = beanDesc.findSerializationInclusion(config.getSerializationInclusion)

val list = for {
cls <- Option(beanDesc.getBeanClass).toSeq if (PRODUCT.isAssignableFrom(cls))
prop <- ScalaBeansUtil.propertiesOf(cls)
prop <- ScalaBeansUtil.propertiesOf(cls) if (prop.findAnnotation[JsonIgnore].map(!_.value).getOrElse(true))
// Not completely happy with this test. I'd rather check the PropertyDescription
// to see if it's a field or a method, but ScalaBeans doesn't expose that as yet.
// I'm not sure if it truly matters as Scala generates method accessors for fields.
// This is also realy inefficient, as we're doing a find on each iteration of the loop.
method <- Option(beanDesc.findMethod(prop.name, Array()))
} yield prop match {
case cp: ConstructorParameter =>
val param = beanDesc.getConstructors.get(0).getParameter(cp.index)
asWriter(config, beanDesc, method, Option(jacksonIntrospector.findNameForDeserialization(param)))
case _ => asWriter(config, beanDesc, method)
} yield {
// Check for the JsonInclude annotation
val suppressNulls = prop.findAnnotation[JsonInclude].getOrElse(defaultInclusion) == NON_NULL
prop match {
case cp: ConstructorParameter =>
val param = beanDesc.getConstructors.get(0).getParameter(cp.index)
asWriter(config, beanDesc, method, suppressNulls, Option(jacksonIntrospector.findNameForDeserialization(param)))
case _ => asWriter(config, beanDesc, method, suppressNulls)
}
}

if (list.isEmpty) beanProperties else new ju.ArrayList[BeanPropertyWriter](list.toList.asJava)
}

private def asWriter(config: SerializationConfig, beanDesc: BeanDescription, member: AnnotatedMethod, primaryName: Option[PropertyName] = None) = {
private def asWriter(config: SerializationConfig, beanDesc: BeanDescription, member: AnnotatedMethod, suppressNulls: Boolean, primaryName: Option[PropertyName] = None) = {
val javaType = config.getTypeFactory.constructType(member.getGenericType)
val defaultName = NameTransformer.decode(member.getName)
val name = maybeTranslateName(config, member, primaryName.map(_.toString).getOrElse(defaultName))
val propDef = new SimpleBeanPropertyDefinition(member, name)
new BeanPropertyWriter(propDef, member, null, javaType, null, null, null, false, null)
new BeanPropertyWriter(propDef, member, null, javaType, null, null, null, suppressNulls, null)
}

private def maybeTranslateName(config: SerializationConfig, member: AnnotatedMethod, name: String) = {
Expand Down

0 comments on commit a6849b1

Please sign in to comment.