Example usage for com.fasterxml.jackson.databind.deser SettableBeanProperty hasValueTypeDeserializer

List of usage examples for com.fasterxml.jackson.databind.deser SettableBeanProperty hasValueTypeDeserializer

Introduction

In this page you can find the example usage for com.fasterxml.jackson.databind.deser SettableBeanProperty hasValueTypeDeserializer.

Prototype

public boolean hasValueTypeDeserializer() 

Source Link

Usage

From source file:com.addthis.codec.jackson.CodecTypeDeserializer.java

private boolean handleDefaultsAndImplicitPrimary(ObjectNode fieldValues, ConfigObject aliasDefaults,
        JsonDeserializer<?> deserializer, DeserializationContext ctxt) throws JsonMappingException {
    if (!aliasDefaults.isEmpty()) {
        if (deserializer instanceof DelegatingDeserializer) {
            deserializer = ((DelegatingDeserializer) deserializer).getDelegatee();
        }/* ww  w  .  ja  v a 2 s  .  c  o m*/
        if ((deserializer instanceof BeanDeserializerBase) && (aliasDefaults.get("_primary") != null)) {
            BeanDeserializerBase beanDeserializer = (BeanDeserializerBase) deserializer;
            String primaryField = (String) aliasDefaults.get("_primary").unwrapped();
            if (!fieldValues.has(primaryField)) {
                // user has not explicitly set a value where _primary points, see if _primary is a plugin type
                SettableBeanProperty primaryProperty = beanDeserializer.findProperty(primaryField);
                if ((primaryProperty != null) && primaryProperty.hasValueTypeDeserializer()) {
                    TypeDeserializer primaryTypeDeserializer = primaryProperty.getValueTypeDeserializer();
                    if (primaryTypeDeserializer instanceof CodecTypeDeserializer) {
                        CodecTypeIdResolver primaryPropertyTypeIdResolver = ((CodecTypeDeserializer) primaryTypeDeserializer).idRes;
                        String possibleInlinedPrimary = null;
                        Iterator<String> fieldNames = fieldValues.fieldNames();
                        while (fieldNames.hasNext()) {
                            String fieldName = fieldNames.next();
                            if ((fieldName.charAt(0) != '_') && !beanDeserializer.hasProperty(fieldName)) {
                                if (primaryPropertyTypeIdResolver.isValidTypeId(fieldName)) {
                                    if (possibleInlinedPrimary == null) {
                                        possibleInlinedPrimary = fieldName;
                                    } else {
                                        String message = String.format(
                                                "%s and %s are both otherwise unknown properties that "
                                                        + "could be types for the _primary property %s whose category is "
                                                        + "%s. This is too ambiguous to resolve.",
                                                possibleInlinedPrimary, fieldName, primaryField,
                                                ((CodecTypeDeserializer) primaryTypeDeserializer).pluginMap
                                                        .category());
                                        JsonMappingException ex = ctxt
                                                .instantiationException(_baseType.getRawClass(), message);
                                        ex.prependPath(beanDeserializer.getValueType(), fieldName);
                                        throw ex;
                                    }
                                }
                            }
                        }
                        // did we find a good candidate?
                        if (possibleInlinedPrimary != null) {
                            // then wrap the value with its key (its type), and stash it in our primary field
                            JsonNode inlinedPrimaryValue = fieldValues.remove(possibleInlinedPrimary);
                            fieldValues.with(primaryField).set(possibleInlinedPrimary, inlinedPrimaryValue);
                            Jackson.merge(fieldValues, Jackson.configConverter(aliasDefaults));
                            return true;
                        }
                    }
                }
            }
        }
        // merge alias defaults here since we check for empty etc anyway
        Jackson.merge(fieldValues, Jackson.configConverter(aliasDefaults));
    }
    return false;
}