package org.emfjson.cdo.sample;
import com.fasterxml.jackson.core.JsonLocation;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.databind.DeserializationContext;
import org.eclipse.emf.cdo.CDOObject;
import org.eclipse.emf.cdo.common.id.CDOID;
import org.eclipse.emf.cdo.common.id.CDOIDUtil;
import org.eclipse.emf.cdo.transaction.CDOTransaction;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.emfjson.common.EObjects;
import org.emfjson.common.ReferenceEntries;
import org.emfjson.common.ReferenceEntries.ReferenceEntry;
import org.emfjson.handlers.URIHandler;
import org.emfjson.jackson.databind.deser.references.ReferenceDeserializer;
import org.emfjson.jackson.errors.JSONException;
import java.io.IOException;
public class CDOReferenceDeserializer implements ReferenceDeserializer {
private final CDOTransaction transaction;
public CDOReferenceDeserializer(CDOTransaction transaction) {
this.transaction = transaction;
}
@Override
public ReferenceEntry deserialize(JsonParser jp, final EObject owner, final EReference reference, DeserializationContext ctxt) throws IOException {
if (JsonToken.VALUE_NUMBER_INT.equals(jp.getCurrentToken())) {
final JsonLocation location = jp.getCurrentLocation();
final long value = jp.getLongValue();
return new ReferenceEntry() {
@Override
public void resolve(ResourceSet resourceSet, URIHandler handler, ReferenceEntries re) {
CDOID cdoid = CDOIDUtil.createLong(value);
CDOObject object;
try {
object = transaction.getObject(cdoid);
} catch (Exception e) {
owner.eResource().getErrors().add(new JSONException(e, location));
return;
}
try {
EObjects.setOrAdd(owner, reference, object);
} catch (Exception e) {
owner.eResource().getErrors().add(new JSONException(e, location));
}
}
};
}
return null;
}
}