package org.javers.core.json.typeadapter.commit; import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import org.javers.common.validation.Validate; import org.javers.core.metamodel.object.CdoSnapshotState; import org.javers.core.metamodel.object.CdoSnapshotStateBuilder; import org.javers.core.metamodel.property.Property; import org.javers.core.metamodel.type.ManagedType; import org.javers.core.metamodel.type.TypeMapper; import java.lang.reflect.Type; import static org.javers.core.metamodel.object.CdoSnapshotStateBuilder.cdoSnapshotState; /** * CdoSnapshotState can't be created by standard {@link CdoSnapshotStateTypeAdapter} * due to required managedType * * @author bartosz walacik */ class CdoSnapshotStateDeserializer { private final TypeMapper typeMapper; private final JsonDeserializationContext context; public CdoSnapshotStateDeserializer(TypeMapper typeMapper, JsonDeserializationContext context) { this.typeMapper = typeMapper; this.context = context; } public CdoSnapshotState deserialize(JsonElement stateElement, ManagedType managedType){ Validate.argumentsAreNotNull(stateElement, managedType, context); JsonObject stateObject = (JsonObject) stateElement; CdoSnapshotStateBuilder builder = cdoSnapshotState(); for (Property property : managedType.getProperties()) { builder.withPropertyValue(property, decodePropertyValue(stateObject, context, property)); } return builder.build(); } private Object decodePropertyValue(JsonObject element, JsonDeserializationContext context, Property property) { JsonElement propertyElement = element.get(property.getName()); Type dehydratedPropertyType = typeMapper.getDehydratedType(property.getGenericType()); return context.deserialize(propertyElement, dehydratedPropertyType); } }