package com.twilio.converter; import com.google.common.base.Joiner; import com.google.common.collect.Lists; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; public class PrefixedCollapsibleMap { private static Map<String, String> flatten( Map<String, Object> map, Map<String, String> result, List<String> previous ) { for (Map.Entry<String, Object> entry : map.entrySet()) { List<String> next = Lists.newArrayList(previous); next.add(entry.getKey()); if (entry.getValue() instanceof Map) { flatten((Map<String, Object>)entry.getValue(), result, next); } else { result.put(Joiner.on('.').join(next), entry.getValue().toString()); } } return result; } /** * Flatten a Map of String, Object into a Map of String, String where keys are '.' separated * and prepends a key. * * @param map map to transform * @param prefix key to prepend * @return flattened map */ public static Map<String, String> serialize(Map<String, Object> map, String prefix) { if (map == null || map.isEmpty()) { return Collections.emptyMap(); } Map<String, String> flattened = flatten(map, new HashMap<String, String>(), new ArrayList<String>()); Map<String, String> result = new HashMap<>(); for (Map.Entry<String, String> entry : flattened.entrySet()) { result.put(prefix + "." + entry.getKey(), entry.getValue()); } return result; } }