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

io.norberg.automatter.jackson.AutoMatterAnnotationIntrospector Maven / Gradle / Ivy

The newest version!
package io.norberg.automatter.jackson;

import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.cfg.MapperConfig;
import com.fasterxml.jackson.databind.introspect.Annotated;
import com.fasterxml.jackson.databind.introspect.AnnotatedConstructor;
import com.fasterxml.jackson.databind.introspect.AnnotatedMember;
import com.fasterxml.jackson.databind.introspect.AnnotatedMethod;
import com.fasterxml.jackson.databind.introspect.AnnotatedParameter;
import com.fasterxml.jackson.databind.introspect.NopAnnotationIntrospector;
import io.norberg.automatter.AutoMatter;

class AutoMatterAnnotationIntrospector extends NopAnnotationIntrospector {

  private static final long serialVersionUID = 1L;
  private final ValueTypeCache typeCache;

  AutoMatterAnnotationIntrospector(final ValueTypeCache typeCache) {
    this.typeCache = typeCache;
  }

  @Override
  public String findImplicitPropertyName(final AnnotatedMember member) {
    final AutoMatter.Field field = member.getAnnotation(AutoMatter.Field.class);
    if (field == null) {
      return null;
    }
    if (member instanceof AnnotatedParameter) {
      return field.value();
    }
    if (member instanceof AnnotatedMethod) {
      return member.getName();
    }
    return null;
  }

  @Override
  public boolean hasCreatorAnnotation(final Annotated a) {
    if (!(a instanceof AnnotatedConstructor)) {
      return false;
    }
    final AnnotatedConstructor ctor = (AnnotatedConstructor) a;
    if (ctor.getParameterCount() == 0) {
      return true;
    }
    final AutoMatter.Field field = ctor.getParameter(0).getAnnotation(AutoMatter.Field.class);
    return field != null;
  }

  @Override
  public JavaType refineSerializationType(
      final MapperConfig config, final Annotated a, final JavaType baseType)
      throws JsonMappingException {
    final Class cls = baseType.getRawClass();

    // Refine only if baseType is an interface explicitly annotated with @AutoMatter
    if (cls.isInterface() && cls.isAnnotationPresent(AutoMatter.class)) {
      return typeCache.resolveValueType(baseType);
    }
    return super.refineSerializationType(config, a, baseType);
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy