package com.megatim.fdxcommons.tools.database.queries.metadata; import com.megatim.fdxcommons.model.integration.ColumnDefinition; import com.megatim.fdxcommons.model.integration.TableDefinition; import com.megatim.fdxcommons.model.integration.enums.FileExtension; import com.megatim.fdxcommons.model.referentiel.natureproduction.NatureProduction; import java.sql.Connection; import java.sql.PreparedStatement; 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 FdxTableDefinition { private final String referentielVersion; private final String codeTypeFichier; private final Connection connection; private TableDefinition tableDefinition; private final List cachedNatureProduction = new ArrayList<>(1); public FdxTableDefinition(String referentielVersion, String codeTypeFichier, Connection connection) { this.referentielVersion = referentielVersion; this.codeTypeFichier = codeTypeFichier; this.connection = connection; } public TableDefinition tableDefinition() throws SQLException, NamingException { if (tableDefinition == null) { tableDefinition = tableDefinition(columnDefinitions()); } return tableDefinition; } public boolean isReferentiel() throws NamingException, SQLException { if (cachedNatureProduction.isEmpty()) { String query = "SELECT natureproduction " + "FROM natureproductionfichier " + "WHERE typefichier_code = ? AND referentiel_version = ?"; try ( PreparedStatement statement = connection.prepareStatement(query)) { statement.setString(1, codeTypeFichier); statement.setString(2, referentielVersion); try ( ResultSet resultSet = statement.executeQuery()) { if (resultSet.next()) { cachedNatureProduction.add(resultSet.getString("natureproduction").equals(NatureProduction.REFERENTIELLE.getValue())); } else { cachedNatureProduction.add(Boolean.TRUE); } } } } return cachedNatureProduction.get(0); } private List columnDefinitions() throws NamingException, SQLException { List columnDefinitions = new ArrayList<>(); String query = "SELECT name, formatdate, position, taille, taillepartiedecimale, typedonnee " + "FROM columndefinition " + "WHERE codetypefichier = ? AND referentielversion = ?"; try ( PreparedStatement statement = connection.prepareStatement(query)) { statement.setString(1, codeTypeFichier); statement.setString(2, referentielVersion); try ( ResultSet resultSet = statement.executeQuery()) { while (resultSet.next()) { String name = resultSet.getString("name"); String typeDonnee = resultSet.getString("typedonnee"); String formatDate = resultSet.getString("formatdate"); int position = resultSet.getInt("position"); int taille = resultSet.getInt("taille"); int taillePartieDecimale = resultSet.getInt("taillepartiedecimale"); columnDefinitions.add(new ColumnDefinition(codeTypeFichier, referentielVersion, name, typeDonnee, taille, taillePartieDecimale, formatDate, position)); } } } Collections.sort(columnDefinitions, (ColumnDefinition c1, ColumnDefinition c2) -> Integer.valueOf(c1.getPosition()).compareTo(c2.getPosition())); return columnDefinitions; } private TableDefinition tableDefinition(List colDefs) throws SQLException { String query = "SELECT columndelimiter, linedelimiter, extension, headerpresent" + " FROM tableDefinition" + " WHERE codetypefichier = ? AND referentielversion = ?"; try ( PreparedStatement statement = connection.prepareStatement(query)) { statement.setString(1, codeTypeFichier); statement.setString(2, referentielVersion); try ( ResultSet resultSet = statement.executeQuery()) { if (resultSet.next()) { String columndelimiter = resultSet.getString("columndelimiter"); String linedelimiter = resultSet.getString("linedelimiter"); String extension = resultSet.getString("extension"); Boolean headerpresent = resultSet.getBoolean("headerpresent"); return new TableDefinition(referentielVersion, codeTypeFichier, headerpresent, columndelimiter, linedelimiter, FileExtension.fromValeur(extension), colDefs); } } } return new TableDefinition(referentielVersion, codeTypeFichier, null, null, null, null, colDefs); } }