package org.ovirt.engine.core.utils.serialization.json; import java.util.Collection; import org.codehaus.jackson.map.MapperConfig; import org.codehaus.jackson.map.ObjectMapper; import org.codehaus.jackson.map.jsontype.NamedType; import org.codehaus.jackson.map.jsontype.TypeIdResolver; import org.codehaus.jackson.type.JavaType; public class JsonCustomTypeResolverBuilder extends ObjectMapper.DefaultTypeResolverBuilder { public JsonCustomTypeResolverBuilder() { this(ObjectMapper.DefaultTyping.OBJECT_AND_NON_CONCRETE); } public JsonCustomTypeResolverBuilder(ObjectMapper.DefaultTyping typing) { super(typing); } /** * Custom type resolver is used only for non concrete collections and maps. * @param t the JavaType of the object */ @Override public boolean useForType(JavaType t) { if ((t.isCollectionLikeType() || t.isMapLikeType()) && !t.isConcrete()) { return true; } return false; } @Override protected TypeIdResolver idResolver(MapperConfig<?> config, JavaType baseType, Collection<NamedType> subtypes, boolean forSer, boolean forDeser) { TypeIdResolver idResolver; if (baseType.isCollectionLikeType()) { // provide a custom id resolver for collections idResolver = new JsonCollectionIdResolver(baseType, config.getTypeFactory()); } else if (baseType.isMapLikeType()) { // provide a custom id resolver for maps idResolver = new JsonMapIdResolver(baseType, config.getTypeFactory()); } else { // use the default resolver idResolver = super.idResolver(config, baseType, subtypes, forSer, forDeser); } return idResolver; } }