package org.ovirt.engine.core.utils.serialization.json;
import java.io.IOException;
import java.io.Serializable;
import org.apache.commons.lang.SerializationException;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.DeserializationConfig.Feature;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.ovirt.engine.core.common.action.VdcActionParametersBase;
import org.ovirt.engine.core.common.businessentities.IVdcQueryable;
import org.ovirt.engine.core.common.businessentities.VM;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.compat.NGuid;
import org.ovirt.engine.core.utils.Deserializer;
import org.ovirt.engine.core.utils.SerializationExeption;
/**
* {@link Deserializer} implementation for deserializing JSON content.
*/
public class JsonObjectDeserializer implements Deserializer {
@Override
public <T extends Serializable> T deserialize(Object source, Class<T> type) throws SerializationExeption {
if (source == null) {
return null;
}
ObjectMapper mapper = new ObjectMapper();
mapper.getDeserializationConfig().addMixInAnnotations(NGuid.class, JsonNGuidMixIn.class);
mapper.getDeserializationConfig().addMixInAnnotations(Guid.class, JsonNGuidMixIn.class);
mapper.getSerializationConfig().addMixInAnnotations(VdcActionParametersBase.class, JsonVdcActionParametersBaseMixIn.class);
mapper.getSerializationConfig().addMixInAnnotations(IVdcQueryable.class, JsonIVdcQueryableMixIn.class);
mapper.getSerializationConfig().addMixInAnnotations(VM.class, JsonVmMixIn.class);
mapper.configure(Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.enableDefaultTyping();
return readJsonString(source, type, mapper);
}
private <T> T readJsonString(Object source, Class<T> type, ObjectMapper mapper) {
try {
return mapper.readValue(source.toString(), type);
} catch (JsonParseException e) {
throw new SerializationException(e);
} catch (JsonMappingException e) {
throw new SerializationException(e);
} catch (IOException e) {
throw new SerializationException(e);
}
}
/**
* Deserialize unformatted Json content.
*
* @param source
* - The object which supposed to be deserialize.
* @return The serialized object.
* @throws SerializationExeption
*/
public <T extends Serializable> T deserializeUnformattedJson(Object source, Class<T> type) throws SerializationExeption {
ObjectMapper mapper = new ObjectMapper();
return readJsonString(source, type, mapper);
}
}