package com.github.rickardoberg.cqrs.memory;

import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.jsontype.impl.TypeIdResolverBase;
import com.fasterxml.jackson.databind.type.SimpleType;

public class CustomClassIdResolver
    extends TypeIdResolverBase {
  public CustomClassIdResolver() {
    super(null, null);
  }

  @Override
  public String idFromValue(Object value) {
    Class<?> aClass = value.getClass();
    if (aClass.isAnonymousClass())
      return aClass.getSuperclass().getName();
    else
      return aClass.getName();
  }

  @Override
  public String idFromValueAndType(Object value, Class<?> suggestedType) {
    return null;
  }

  @Override
  public JavaType typeFromId(String id) {
    try {
      return SimpleType.construct(Thread.currentThread().getContextClassLoader().loadClass(id));
    } catch (ClassNotFoundException e) {
      throw new RuntimeException(e);
    }
  }

  @Override
  public JsonTypeInfo.Id getMechanism() {
    return JsonTypeInfo.Id.CUSTOM;
  }
}