package org.apache.cayenne.demo.model.types;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.apache.cayenne.CayenneRuntimeException;
import org.apache.cayenne.access.types.ValueObjectType;
import org.apache.cayenne.value.Json;
import org.apache.cayenne.di.Inject;

public class JsonValueType implements ValueObjectType<ObjectNode, Json> {

    @Inject
    ObjectMapper objectMapper;

    @Override
    public Class<Json> getTargetType() {
        return Json.class;
    }

    @Override
    public Class<ObjectNode> getValueType() {
        return ObjectNode.class;
    }

    @Override
    public ObjectNode toJavaObject(Json value) {
        try {
            return (ObjectNode) objectMapper.readTree(value.getRawJson());
        } catch (Exception e) {
            throw new CayenneRuntimeException("Unable to parse JSON", e);
        }
    }

    @Override
    public Json fromJavaObject(ObjectNode object) {
        return new Json(object.toString());
    }

    @Override
    public String toCacheKey(ObjectNode object) {
        return object.toString();
    }
}
