package com.fasterxml.jackson.dataformat.xml;

import java.util.Collection;

import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.ObjectMapper.DefaultTyping;
import com.fasterxml.jackson.databind.cfg.MapperConfig;
import com.fasterxml.jackson.databind.jsontype.NamedType;
import com.fasterxml.jackson.databind.jsontype.PolymorphicTypeValidator;
import com.fasterxml.jackson.databind.jsontype.TypeIdResolver;
import com.fasterxml.jackson.databind.jsontype.impl.StdTypeResolverBuilder;

import com.fasterxml.jackson.dataformat.xml.util.StaxUtil;

Sub-class of StdTypeResolverBuilder specifically used with Default Typing.

Composition/sub-classing gets quite tricky here: ideally we would just extend XmlTypeResolverBuilder but unfortunately inheritance hierarchy does not allow this.

Since:2.10
/** * Sub-class of {@code StdTypeResolverBuilder} specifically used with * Default Typing. *<p> * Composition/sub-classing gets quite tricky here: ideally we would just * extend {@link XmlTypeResolverBuilder} but unfortunately inheritance hierarchy * does not allow this. * * @since 2.10 */
public class DefaultingXmlTypeResolverBuilder extends ObjectMapper.DefaultTypeResolverBuilder implements java.io.Serializable { private static final long serialVersionUID = 1L; public DefaultingXmlTypeResolverBuilder(DefaultTyping t, PolymorphicTypeValidator ptv) { super(t, ptv); } /* /********************************************************************** /* Methods copied from `XmlTypeResolverBuilder` /********************************************************************** */ @Override public StdTypeResolverBuilder init(JsonTypeInfo.Id idType, TypeIdResolver idRes) { super.init(idType, idRes); if (_typeProperty != null) { _typeProperty = StaxUtil.sanitizeXmlTypeName(_typeProperty); } return this; } @Override public StdTypeResolverBuilder typeProperty(String typeIdPropName) { // ok to have null/empty; will restore to use defaults if (typeIdPropName == null || typeIdPropName.length() == 0) { typeIdPropName = _idType.getDefaultPropertyName(); } _typeProperty = StaxUtil.sanitizeXmlTypeName(typeIdPropName); return this; } @Override protected TypeIdResolver idResolver(MapperConfig<?> config, JavaType baseType, PolymorphicTypeValidator subtypeValidator, Collection<NamedType> subtypes, boolean forSer, boolean forDeser) { if (_customIdResolver != null) { return _customIdResolver; } // Only override handlers of class, minimal class; name is good as is switch (_idType) { case CLASS: return new XmlTypeResolverBuilder.XmlClassNameIdResolver(baseType, config.getTypeFactory(), subTypeValidator(config)); case MINIMAL_CLASS: return new XmlTypeResolverBuilder.XmlMinimalClassNameIdResolver(baseType, config.getTypeFactory(), subTypeValidator(config)); default: } return super.idResolver(config, baseType, subtypeValidator, subtypes, forSer, forDeser); } }