package com.fasterxml.jackson.dataformat.avro.deser;

import java.util.*;

import com.fasterxml.jackson.databind.JsonNode;

Factory class for various default providers
/** * Factory class for various default providers */
public class AvroFieldDefaulters { public static AvroFieldReader createDefaulter(String name, JsonNode defaultAsNode) { switch (defaultAsNode.asToken()) { case VALUE_TRUE: return new ScalarDefaults.BooleanDefaults(name, true); case VALUE_FALSE: return new ScalarDefaults.BooleanDefaults(name, false); case VALUE_NULL: return new ScalarDefaults.NullDefaults(name); case VALUE_NUMBER_FLOAT: switch (defaultAsNode.numberType()) { case FLOAT: return new ScalarDefaults.FloatDefaults(name, (float) defaultAsNode.asDouble()); case DOUBLE: case BIG_DECIMAL: // TODO: maybe support separately? default: return new ScalarDefaults.DoubleDefaults(name, defaultAsNode.asDouble()); } case VALUE_NUMBER_INT: switch (defaultAsNode.numberType()) { case INT: return new ScalarDefaults.FloatDefaults(name, defaultAsNode.asInt()); case BIG_INTEGER: // TODO: maybe support separately? case LONG: default: return new ScalarDefaults.FloatDefaults(name, defaultAsNode.asLong()); } case VALUE_STRING: return new ScalarDefaults.StringDefaults(name, defaultAsNode.asText()); case START_OBJECT: { Iterator<Map.Entry<String,JsonNode>> it = defaultAsNode.fields(); List<AvroFieldReader> readers = new ArrayList<AvroFieldReader>(); while (it.hasNext()) { Map.Entry<String,JsonNode> entry = it.next(); String propName = entry.getKey(); readers.add(createDefaulter(propName, entry.getValue())); } return StructDefaults.createObjectDefaults(name, readers); } case START_ARRAY: { List<AvroFieldReader> readers = new ArrayList<AvroFieldReader>(); for (JsonNode value : defaultAsNode) { readers.add(createDefaulter("", value)); } return StructDefaults.createArrayDefaults(name, readers); } default: } return null; } // 23-Jul-2019, tatu: With Avro 1.9, likely changed to use "raw" JDK containers? // Code would look more like this: /* public static AvroFieldReader createDefaulter(String name, Object defaultValue) { if (defaultValue == null) { return new ScalarDefaults.NullDefaults(name); } if (defaultValue instanceof Boolean) { return new ScalarDefaults.BooleanDefaults(name, ((Boolean) defaultValue).booleanValue()); } if (defaultValue instanceof String) { return new ScalarDefaults.StringDefaults(name, (String) defaultValue); } if (defaultValue instanceof Number) { Number n = (Number) defaultValue; if (defaultValue instanceof Long) { return new ScalarDefaults.LongDefaults(name, n.longValue()); } if (defaultValue instanceof Integer) { return new ScalarDefaults.IntDefaults(name, n.intValue()); } if ((defaultValue instanceof Double) || (defaultValue instanceof java.math.BigDecimal)) { return new ScalarDefaults.DoubleDefaults(name, n.doubleValue()); } if (defaultValue instanceof Float) { return new ScalarDefaults.FloatDefaults(name, n.floatValue()); } } if (defaultValue instanceof List<?>) { List<AvroFieldReader> readers = new ArrayList<AvroFieldReader>(); for (Object value : ((List<?>) defaultValue)) { readers.add(createDefaulter("", value)); } return StructDefaults.createArrayDefaults(name, readers); } if (defaultValue instanceof Map<?,?>) { List<AvroFieldReader> readers = new ArrayList<AvroFieldReader>(); @SuppressWarnings("unchecked") Map<String, Object> mapValue = (Map<String, Object>) defaultValue; for (Map.Entry<String, Object> entry : mapValue.entrySet()) { readers.add(createDefaulter(entry.getKey(), entry.getValue())); } return StructDefaults.createObjectDefaults(name, readers); } throw new IllegalArgumentException("Unrecognized default value type: " + ClassUtil.classNameOf(defaultValue)); } */ }