package org.javers.core.json.typeadapter.change;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonSerializationContext;
import org.javers.core.commit.CommitMetadata;
import org.javers.core.diff.changetype.ReferenceChange;
import org.javers.core.metamodel.object.GlobalId;
import org.javers.core.metamodel.type.TypeMapper;
import java.util.Optional;
import static java.util.Optional.of;
import static java.util.Optional.ofNullable;
class ReferenceChangeTypeAdapter extends ChangeTypeAdapter<ReferenceChange> {
private static final String LEFT_REFERENCE_FIELD = "left";
private static final String RIGHT_REFERENCE_FIELD = "right";
public ReferenceChangeTypeAdapter(TypeMapper typeMapper) {
super(typeMapper);
}
@Override
public ReferenceChange fromJson(JsonElement json, JsonDeserializationContext context) {
JsonObject jsonObject = (JsonObject) json;
PropertyChangeStub stub = deserializeStub(jsonObject, context);
GlobalId leftRef = context.deserialize(jsonObject.get(LEFT_REFERENCE_FIELD), GlobalId.class);
GlobalId rightRef = context.deserialize(jsonObject.get(RIGHT_REFERENCE_FIELD), GlobalId.class);
CommitMetadata commitMetadata = deserializeCommitMetadata(jsonObject, context);
return new ReferenceChange(stub.id, stub.getPropertyName(), leftRef, rightRef, null, null, ofNullable(commitMetadata));
}
@Override
public JsonElement toJson(ReferenceChange change, JsonSerializationContext context) {
final JsonObject jsonObject = createJsonObject(change, context);
jsonObject.add(LEFT_REFERENCE_FIELD, context.serialize(change.getLeft()));
jsonObject.add(RIGHT_REFERENCE_FIELD, context.serialize(change.getRight()));
return jsonObject;
}
@Override
public Class getValueType() {
return ReferenceChange.class;
}
}