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

io.yawp.driver.postgresql.EntityToObjectConverter Maven / Gradle / Ivy

There is a newer version: 2.08alpha
Show newest version
package io.yawp.driver.postgresql;

import io.yawp.commons.http.HttpVerb;
import io.yawp.commons.utils.DateUtils;
import io.yawp.commons.utils.JsonUtils;
import io.yawp.commons.utils.ReflectionUtils;
import io.yawp.driver.postgresql.datastore.Entity;
import io.yawp.repository.IdRef;
import io.yawp.repository.LazyJson;
import io.yawp.repository.Repository;
import io.yawp.repository.models.FieldModel;
import io.yawp.repository.models.ObjectHolder;
import io.yawp.repository.models.ObjectModel;

import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;

public class EntityToObjectConverter {

    private Repository r;

    public EntityToObjectConverter(Repository r) {
        this.r = r;
    }

    public Object convert(ObjectModel model, Entity entity) {
        Object object = model.createInstance();

        ObjectHolder objectHolder = new ObjectHolder(object);
        objectHolder.setId(IdRefToKey.toIdRef(r, entity.getKey(), model));

        List fieldModels = objectHolder.getModel().getFieldModels();

        for (FieldModel fieldModel : fieldModels) {
            if (fieldModel.isId()) {
                continue;
            }

            if (fieldModel.isTransient()) {
                continue;
            }

            safeSetObjectProperty(entity, object, fieldModel);
        }

        return object;
    }

    private  void safeSetObjectProperty(Entity entity, T object, FieldModel fieldModel) {
        try {
            setObjectProperty(object, entity, fieldModel, fieldModel.getField());
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        }
    }

    private  void setObjectProperty(T object, Entity entity, FieldModel fieldModel, Field field) throws IllegalAccessException {
        Object value = entity.getProperty(field.getName());

        if (value == null) {
            field.set(object, null);
            return;
        }

        if (fieldModel.isEnum()) {
            setEnumProperty(object, field, value);
            return;
        }

        if (fieldModel.isSaveAsJson()) {
            setJsonProperty(r, object, field, value);
            return;
        }

        if (fieldModel.isSaveAsLazyJson()) {
            setLazyJsonProperty(object, field, value);
            return;
        }

        if (fieldModel.isInt()) {
            setIntProperty(object, field, value);
            return;
        }

        // overrides
        if (fieldModel.isLong()) {
            setLongProperty(object, field, value);
            return;
        }

        // overrides
        if (fieldModel.isDate()) {
            setDateProperty(object, field, value);
            return;
        }

        if (fieldModel.isIdRef()) {
            setIdRefProperty(r, object, field, value);
            return;
        }

        if (fieldModel.isSaveAsText()) {
            setTextProperty(object, field, value);
            return;
        }

        if (fieldModel.isListOfIds()) {
            setListOfIdsProperty(object, field, value);
        }

        field.set(object, value);
    }

    private  void setIdRefProperty(Repository r, T object, Field field, Object value) throws IllegalAccessException {
        field.set(object, IdRef.parse(r, HttpVerb.GET, (String) value));
    }

    private  void setIntProperty(T object, Field field, Object value) throws IllegalAccessException {
        // override
        field.set(object, ((Number) value).intValue());
    }

    // override
    private  void setLongProperty(T object, Field field, Object value) throws IllegalAccessException {
        field.set(object, ((Number) value).longValue());
    }

    // override
    private  void setDateProperty(T object, Field field, Object value) throws IllegalAccessException {
        field.set(object, DateUtils.toTimestamp((String) value));
    }

    private  void setTextProperty(T object, Field field, Object value) throws IllegalAccessException {
        // override
        field.set(object, ((String) value));
    }

    private  void setJsonProperty(Repository r, T object, Field field, Object value) throws IllegalAccessException {
        // override
        String json = (String) value;
        field.set(object, JsonUtils.from(r, json, field.getGenericType()));
    }

    private  void setLazyJsonProperty(T object, Field field, Object value) throws IllegalAccessException {
        String json = (String) value;
        Type type = ((ParameterizedType) field.getGenericType()).getActualTypeArguments()[0];
        field.set(object, LazyJson.$create(type, json));
    }

    @SuppressWarnings({"unchecked", "rawtypes"})
    private  void setEnumProperty(T object, Field field, Object value) throws IllegalAccessException {
        field.set(object, Enum.valueOf((Class) field.getType(), value.toString()));
    }

    private  void setListOfIdsProperty(T object, Field field, Object value) throws IllegalAccessException {
        List uris = (List) value;
        List> ids = new ArrayList<>(uris.size());
        Class listGenericClazz = ReflectionUtils.getListGenericType(field.getGenericType());

        for (String uri : uris) {
            ids.add(r.parseId(listGenericClazz, uri));
        }

        field.set(object, ids);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy