/* * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template */ package com.megatim.fdxcommons.tools.database.contrat; import com.megatim.fdxcommons.model.integration.ColumnDefinition; import com.megatim.fdxcommons.model.pojo.JsonTableDefinition; import com.megatim.fdxcommons.tools.database.tables.appcolumns.IndexColumnDefinition; import com.megatim.fdxcommons.tools.database.tables.appcolumns.ParentIdColumnDefinition; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.HashMap; import java.util.List; import java.util.Map; /** * * @author ASUS */ public class JsonResultSetProcessor { private final ResultSet resultSet; private final JsonTableDefinition tableDefinition; public JsonResultSetProcessor(ResultSet resultSet, JsonTableDefinition tableDefinition) { this.resultSet = resultSet; this.tableDefinition = tableDefinition; } public Map process() throws SQLException { Map data = new HashMap<>(); while (resultSet.next()) { mergeData(resultSet, tableDefinition, data, null); } return data; } /** * * @param resSet : ligne de données à traiter * @param tableDefinition : structure de la donnée à extraire * @param data : données ayant été extraites lors des précédents parcours * @param parentId : L'id du parent de la donnée * @return : retourne les données extraites * @throws SQLException */ private Object mergeData(ResultSet resSet, JsonTableDefinition tableDefinition, Map data, Long parentId) throws SQLException { Map columnsAliasToColumnName = columnsAliasToColumnName(tableDefinition.getColumnDefs(), tableDefinition.getTableName()); String indexAlias = columnAlias(tableDefinition.getTableName(), new IndexColumnDefinition().name()); final Long fdxIndex = resSet.getLong(indexAlias); String parentIdAlias = null; Long childParentId = null; if (parentId != null) { parentIdAlias = columnAlias(tableDefinition.getTableName(), new ParentIdColumnDefinition().name()); childParentId = resSet.getLong(parentIdAlias); } if (parentId == null || parentId.equals(childParentId)) { if (data.containsKey(fdxIndex)) { Object obj = data.get(fdxIndex); Map map = (Map) obj; for (JsonTableDefinition t : tableDefinition.getTablesDefinition()) { Object ob = (Map) map.get(t.getParentFieldName()); Map m = new HashMap<>(); if (ob != null) { m = (Map) ob; } map.put(t.getParentFieldName(), mergeData(resSet, t, m, fdxIndex)); data.put(fdxIndex, map); } } else { Map simpleData = simpleData = retrieveData(resSet, columnsAliasToColumnName); data.put(fdxIndex, simpleData); for (JsonTableDefinition t : tableDefinition.getTablesDefinition()) { String newParentIdAlias = columnAlias(t.getTableName(), new ParentIdColumnDefinition().name()); Long newChildParentId = resSet.getLong(newParentIdAlias); if (newChildParentId.equals(fdxIndex)) { Map m = new HashMap<>(); mergeData(resSet, t, m, fdxIndex); simpleData.put(t.getParentFieldName(), m); } } return data; } } return data; } /** * Extraction des données simples d'un objet * * @param resultSet * @param columnsAliasToColumnName * @return * @throws SQLException */ private Map retrieveData(ResultSet resultSet, Map columnsAliasToColumnName) throws SQLException { ResultSetMetaData metaData = resultSet.getMetaData(); int columnCount = metaData.getColumnCount(); Map selectResult = new HashMap<>(); for (int i = 1; i <= columnCount; i++) { if (columnsAliasToColumnName.containsKey(metaData.getColumnName(i).trim().toLowerCase())) { selectResult.put(columnsAliasToColumnName.get(metaData.getColumnName(i).trim().toLowerCase()), resultSet.getObject(i)); } } return selectResult; } /** * Méthode qui associe chaque alias de colonne au nom réel de colonne * * @param columnsDef * @param tableName : table * @return */ private Map columnsAliasToColumnName(List columnsDef, String tableName) { Map columnsAliasToColumnName = new HashMap<>(); columnsDef.stream().forEach(c -> { columnsAliasToColumnName.put(columnAlias(tableName, c.getName()), c.getName()); }); columnsAliasToColumnName.put(columnAlias(tableName, new IndexColumnDefinition().name()), new IndexColumnDefinition().name()); columnsAliasToColumnName.put(columnAlias(tableName, new ParentIdColumnDefinition().name()), new ParentIdColumnDefinition().name()); return columnsAliasToColumnName; } private String columnAlias(String tableName, String columnName) { return (tableName + "_" + columnName).toLowerCase(); } }