package com.megatim.fdxcommons.tools.database.tables; import com.megatim.fdxcommons.tools.exceptions.FdxColumnNotFoundException; import com.megatim.fdxcommons.tools.database.contrat.TableName; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.naming.NamingException; /** * * @author Gabuntu */ public class FdxTableColumns { private final TableName tableName; private final Connection connection; private final List fdxTableColumns = new ArrayList<>(); public FdxTableColumns(TableName tableName, Connection connection) { this.tableName = tableName; this.connection = connection; } public List columns() throws SQLException, NamingException { if (fdxTableColumns.isEmpty()) { DatabaseMetaData metaData = connection.getMetaData(); ResultSet columns = metaData.getColumns(null, null, tableName.name(connection), null); while (columns.next()) { String name = columns.getString("COLUMN_NAME"); int type = columns.getInt("DATA_TYPE"); int position = columns.getInt("ORDINAL_POSITION"); int size = columns.getInt("COLUMN_SIZE"); fdxTableColumns.add(new FdxTableColumn(name, type, position, size)); } Collections.sort(fdxTableColumns, (c1, c2) -> Integer.valueOf(c1.getPosition()).compareTo(c2.getPosition())); } return fdxTableColumns; } public FdxTableColumn column(String name) throws FdxColumnNotFoundException, SQLException, NamingException { return columns() .stream() .filter(c -> c.getName().equals(name)) .findFirst() .orElseThrow(() -> new FdxColumnNotFoundException("Colonne introuvable dans la table")); } }