/** * 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 verifyTypeOfAField(Map<Integer, Map<String, Object>> mapMain, Field field, Object objectToConvert, Map<String, Object> map) throws IllegalAccessException { Class<?> type = field.getType(); // Verifica qual o tipo de campo if (Collection.class.isAssignableFrom(type)) { fieldIsACollection(mapMain, field, objectToConvert, map); } else if (Map.class.isAssignableFrom(type)) { fieldIsAMap(mapMain, field, objectToConvert, map); } else { fieldIsAObjectClass(mapMain, field, objectToConvert, map, type); } }
private static void fieldIsAObjectClass(Map<Integer, Map<String, Object>> mapMain, Field field, Object objectToConvert, Map<String, Object> map, Class<?> type) throws IllegalAccessException { // caso contrario é um obj ou um tipo normal Object obj = field.get(objectToConvert); if (type.isPrimitive() || STOP_CRITERY.contains(type)) { map.put(field.getName(), obj); } else { fieldIsANonPrimitiveObject(mapMain, field, map, type, obj); } }
@Override protected SInstance createInstance(SFormConfig<String> singularFormConfig) { SInstance createInstance = SDocumentFactory.empty().createInstance(new RefType() { @Override protected SType<?> retrieve() { return singularFormConfig.getTypeLoader().loadTypeOrException(SDbHealth.TYPE_FULL_NAME); } }); HealthInfoDTO infoHealthTest = painelService.getAllDbMetaData(); try { TransformPojoUtil.pojoToSInstance(infoHealthTest, createInstance, false); } catch (Exception e) { e.printStackTrace(); } return createInstance; } };
@SuppressWarnings("unchecked") private static void realMapToSInstance(Map<Integer, Map<String, Object>> pojoReferenceDataMap, Object pojoDataMap, SInstance rootInstance, boolean strictMode) { SType<?> type = rootInstance.getType(); if (type.isComposite()) { mapToSIComposite(pojoReferenceDataMap, (Map<String, Object>) pojoDataMap, (SIComposite) rootInstance, strictMode); } else if (type.isList()) { mapToSIList(pojoReferenceDataMap, (Map<String, Object>) pojoDataMap, (SIList<SInstance>) rootInstance, strictMode, type); } else { rootInstance.setValue(((Map<String, Object>) pojoDataMap).get(type.getNameSimple())); } }
@Override protected void onInitialize() { super.onInitialize(); SingularFormPanel panelBD = new SingularFormPanel("panelDB", SDbHealth.class); panelBD.setInstanceInitializer(instance -> { HealthInfoDTO infoHealthTest = servicePanel.getAllDbMetaData(); TransformPojoUtil.pojoToSInstance(infoHealthTest, instance, false); }); SingularValidationButton checkButton = new SingularValidationButton("checkButtonDB", panelBD.getInstanceModel()){ @Override protected void onValidationSuccess(AjaxRequestTarget target, Form<?> form, IModel<? extends SInstance> instanceModel) { new SingularToastrHelper(this). addToastrMessage(ToastrType.SUCCESS, "All tables are accessible as expected!"); } @Override protected void onValidationError(AjaxRequestTarget target, Form<?> form, IModel<? extends SInstance> instanceModel) { super.onValidationError(target, form, instanceModel); } }; add(panelBD); add(checkButton); } }
@Override protected void onInitialize() { super.onInitialize(); SingularFormPanel panelBD = new SingularFormPanel("panelDB", SDbHealth.class); panelBD.setInstanceInitializer(instance -> { HealthInfoDTO infoHealthTest = servicePanel.getAllDbMetaData(); TransformPojoUtil.pojoToSInstance(infoHealthTest, instance, false); }); SingularValidationButton checkButton = new SingularValidationButton("checkButtonDB", panelBD.getInstanceModel()){ @Override protected void onValidationSuccess(AjaxRequestTarget target, Form<?> form, IModel<? extends SInstance> instanceModel) { new SingularToastrHelper(this). addToastrMessage(ToastrType.SUCCESS, "All tables are accessible as expected!"); } @Override protected void onValidationError(AjaxRequestTarget target, Form<?> form, IModel<? extends SInstance> instanceModel) { super.onValidationError(target, form, instanceModel); } }; add(panelBD); add(checkButton); } }
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); } }); } } }
@Override protected void onInitialize() { super.onInitialize(); SingularFormPanel panelBD = new SingularFormPanel("panelDB", SDbHealth.class); panelBD.setInstanceInitializer(instance -> { HealthInfoDTO infoHealthTest = servicePanel.getAllDbMetaData(); TransformPojoUtil.pojoToSInstance(infoHealthTest, instance, false); }); SingularValidationButton checkButton = new SingularValidationButton("checkButtonDB", panelBD.getInstanceModel()){ @Override protected void onValidationSuccess(AjaxRequestTarget target, Form<?> form, IModel<? extends SInstance> instanceModel) { new SingularToastrHelper(this). addToastrMessage(ToastrType.SUCCESS, "All tables are accessible as expected!"); } @Override protected void onValidationError(AjaxRequestTarget target, Form<?> form, IModel<? extends SInstance> instanceModel) { super.onValidationError(target, form, instanceModel); } }; add(panelBD); add(checkButton); } }
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; }