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<Boolean> 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<ColumnDefinition> columnDefinitions() throws NamingException, SQLException {
|
List<ColumnDefinition> 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<ColumnDefinition> 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);
|
}
|
}
|