39 lines
1.3 KiB
Java
39 lines
1.3 KiB
Java
package ru.kirillius.XCP.Persistence;
|
|
|
|
import tools.jackson.core.JacksonException;
|
|
import tools.jackson.core.JsonParser;
|
|
import tools.jackson.databind.DeserializationContext;
|
|
import tools.jackson.databind.deser.std.StdDeserializer;
|
|
|
|
import java.util.UUID;
|
|
|
|
public class EntityReferenceDeserializer extends StdDeserializer<EntityReference> {
|
|
|
|
private final RepositoryServiceImpl repositoryService;
|
|
|
|
public EntityReferenceDeserializer(RepositoryServiceImpl repositoryService) {
|
|
super(EntityReference.class);
|
|
this.repositoryService = repositoryService;
|
|
}
|
|
|
|
@Override
|
|
public EntityReference deserialize(JsonParser p, DeserializationContext ctxt) throws JacksonException {
|
|
var node = ctxt.readTree(p);
|
|
var type = node.get("type").asString();
|
|
var id = node.get("id").asLong();
|
|
var uuid = node.get("uuid").asString();
|
|
|
|
try {
|
|
@SuppressWarnings("unchecked")
|
|
var repository = repositoryService.getRepositoryForEntity((Class<? extends PersistenceEntity>) Class.forName(type));
|
|
if (uuid != null) {
|
|
return new EntityReference(repository.get(UUID.fromString(uuid)));
|
|
}
|
|
return new EntityReference(repository.get(id));
|
|
} catch (ClassNotFoundException e) {
|
|
throw new RuntimeException(e);
|
|
}
|
|
|
|
}
|
|
}
|