/** * metodo para transformar um objeto em um map com os valores dele * * @param objectToConvert o objeto que deseja obter o map * @return retorna o Map com o objeto que se queria converter e todos os objetos pendurados a ele, * para recuperá-lo deve-se usar System.identityHashCode() passando o objectToConvert como argumento. * @throws RuntimeException quando o Objeto a ser mapeado possui um map dentro dele. Não foi implementado ainda. */ public static Map<Integer, Map<String, Object>> pojoToMap(Object objectToConvert) { Map<Integer, Map<String, Object>> fieldsTST = new HashMap<>(); fieldsTST.put(System.identityHashCode(objectToConvert), new HashMap<>()); Map<String, Object> mapRootObj = new HashMap<>(); fieldsTST.put(System.identityHashCode(objectToConvert), mapRootObj); Arrays.asList(objectToConvert.getClass().getDeclaredFields()) .forEach(f -> convertObjectToMap(fieldsTST, f, objectToConvert)); return fieldsTST; }
private static void fieldIsANonPrimitiveObject(Map<Integer, Map<String, Object>> mapMain, Field field, Map<String, Object> map, Class<?> type, Object obj) { if (obj == null) { map.put(field.getName(), null); } else { // se ja existe, coloca-se apenas a referencia do obj if (mapMain.containsKey(System.identityHashCode(obj))) { map.put(field.getName(), "codRef=" + System.identityHashCode(obj)); } else { // senao, gera-se o dados necessarios Map<String, Object> mapChildItem = new HashMap<>(); // cria o mapa do obj filho mapMain.put(System.identityHashCode(obj), mapChildItem); // add no mapa de referencia map.put(field.getName(), mapChildItem); // add no obj pai Arrays.asList(type.getDeclaredFields()).forEach(f -> { try { convertObjectToMap(mapMain, f, obj); } catch (Exception e) { LOGGER.error(e.getMessage(), e); } }); } } }
private static List<Object> populateCollection(Map<Integer, Map<String, Object>> mapMain, Iterator<?> iterator) { List<Object> colecao = new ArrayList<>(); while (iterator.hasNext()) { Object item = iterator.next(); if (item.getClass().isPrimitive() || STOP_CRITERY.contains(item.getClass())) { // maneira feita para garantir o tipo primitivo de ser colocado, e de se ter uma lista dele no SInstance Map<String, Object> itemMap = new HashMap<>(); String[] value = item.getClass().getName().split("\\."); itemMap.put(value[value.length - 1], item); colecao.add(itemMap); } else { Map<String, Object> itemMap = mapMain.get(System.identityHashCode(item)); if (itemMap == null) { itemMap = new HashMap<>(); mapMain.put(System.identityHashCode(item), itemMap); } Arrays.asList(item.getClass().getDeclaredFields()).forEach(f -> convertObjectToMap(mapMain, f, item)); colecao.add(itemMap); } } return colecao; }