package com.megatim.fdxcommons.tools.database.tables; import com.megatim.fdxcommons.model.enumeration.Operateur; import com.megatim.fdxcommons.tools.database.queries.DataWithTokenToDataProductionQuery; import com.megatim.fdxcommons.tools.database.tables.appcolumns.FdxApiColumnDefinitions; import com.megatim.fdxcommons.model.dataproduction.CommonDataProduction; import com.megatim.fdxcommons.model.integration.ColumnDefinition; import com.megatim.fdxcommons.tools.database.queries.FdxApiInsert; import com.megatim.fdxcommons.tools.database.queries.metadata.QueryCriterion; import com.megatim.fdxcommons.tools.database.contrat.TypeFichierUpdateMetaData; import com.megatim.fdxcommons.tools.database.exceptions.TypeFichierDataBadRequest; import com.megatim.fdxcommons.tools.database.contrat.TypeFichierInsertMetaData; import com.megatim.fdxcommons.tools.database.exceptions.MoreThanOneTableDataNotFoundException; import com.megatim.fdxcommons.tools.database.exceptions.TableDataNotFoundException; import com.megatim.fdxcommons.tools.database.queries.CreateTableIfNotExistQuery; import com.megatim.fdxcommons.tools.database.queries.FdxUpdate; import com.megatim.fdxcommons.tools.database.queries.metadata.ApiTypeFichierInsertData; import com.megatim.fdxcommons.tools.database.queries.metadata.ApiUpdateTypeFichierData; import com.megatim.fdxcommons.tools.database.queries.metadata.FdxParsedData; import com.megatim.fdxcommons.tools.database.queries.metadata.FdxParsedDataRow; import com.megatim.fdxcommons.tools.database.queries.metadata.FdxTableDefinition; import com.megatim.fdxcommons.tools.database.queries.metadata.ParsedQueryCriterion; import com.megatim.fdxcommons.tools.database.tables.appcolumns.TokenColumnDefinition; import java.sql.Connection; import java.sql.SQLException; import java.util.Arrays; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; import javax.naming.NamingException; /** * * @author Gabuntu */ public class FdxApiTable extends FdxTable { public FdxApiTable(String codeTypeFichier, String referentielVersion) { super(codeTypeFichier, referentielVersion); } @Override public void createTable(List columnsDefinition, Connection connection) throws NamingException, SQLException, Exception { new CreateTableIfNotExistQuery(tableName, columnsDefinition, new FdxApiColumnDefinitions(), connection).execute(); } @Override public void deleteOne(QueryCriterion queryCriterion, CommonDataProduction dataProduction, Connection connection) throws TypeFichierDataBadRequest, SQLException, NamingException, Exception { stopIfTableIsReferentiel(connection); ParsedQueryCriterion parsedQueryCriterion = parsedQueryCriterion(queryCriterion, connection); stopIfTableDataNotFound(parsedQueryCriterion, connection); processDelete(parsedQueryCriterion.parsedCriterion(), dataProduction, connection); } @Override public void updateOne(Map dataToUpdate, QueryCriterion queryCriterion, CommonDataProduction dataProduction, Connection connection) throws TypeFichierDataBadRequest, SQLException, NamingException, Exception { stopIfTableIsReferentiel(connection); ParsedQueryCriterion parsedQueryCriteria = parsedQueryCriterion(queryCriterion, connection); stopIfTableDataNotFound(parsedQueryCriteria, connection); stopIfNotOneTableDataFound(parsedQueryCriteria, connection); processUpdate(dataToUpdate, parsedQueryCriteria.parsedCriterion(), dataProduction, connection); } @Override public void update(Map dataToUpdate, QueryCriterion queryCriterion, CommonDataProduction dataProduction, Connection connection) throws TypeFichierDataBadRequest, SQLException, NamingException, Exception { stopIfTableIsReferentiel(connection); ParsedQueryCriterion parsedQueryCriterion = parsedQueryCriterion(queryCriterion, connection); stopIfTableDataNotFound(parsedQueryCriterion, connection); processUpdate(dataToUpdate, parsedQueryCriterion.parsedCriterion(), dataProduction, connection); } public void insert(List> originalData, Long dataProductionId, Connection connection) throws TypeFichierDataBadRequest, SQLException, NamingException, Exception { FdxParsedData fdxParsedData = new FdxParsedData(originalData, tableDefinition(connection).tableDefinition()); TypeFichierInsertMetaData insertMetaData = new ApiTypeFichierInsertData(tableName.name(connection), fdxParsedData); new FdxApiInsert(connection, dataProductionId).insert(insertMetaData); } public void insert(List> originalData, String token, Connection connection) throws TypeFichierDataBadRequest, SQLException, NamingException, Exception { FdxParsedData fdxParsedData = new FdxParsedData(originalData, tableDefinition(connection).tableDefinition()); TypeFichierInsertMetaData insertMetaData = new ApiTypeFichierInsertData(tableName.name(connection), fdxParsedData); new FdxApiInsert(connection, null).insert(insertMetaData, token); } public void linkDataWithTokenToDataProduction(CommonDataProduction dataProduction, String token, Connection connection) throws Exception { new DataWithTokenToDataProductionQuery(connection, dataProduction, token, tableName.name(connection)).execute(); } public void deleteDataLinkedToToken(String token, Connection connection) throws TypeFichierDataBadRequest, SQLException, NamingException, Exception { ParsedQueryCriterion parsedQueryCriterion = parsedQueryCriterion(new QueryCriterion(new TokenColumnDefinition().name(), token, Operateur.EQUALS, null, Arrays.asList()), connection); processPermanentDelete(parsedQueryCriterion.parsedCriterion(), connection); } private void processUpdate(Map dataToUpdate, QueryCriterion queryCriterion, CommonDataProduction dataProduction, Connection connection) throws NamingException, Exception, SQLException { FdxTableDefinition tableDefinition = tableDefinition(connection); FdxParsedDataRow parsedDataRow = new FdxParsedDataRow(dataToUpdate, tableDefinition.tableDefinition()); TypeFichierUpdateMetaData updateMetaData = new ApiUpdateTypeFichierData(tableName.name(connection), parsedDataRow); new FdxUpdate(connection, parsedQueryCriterion(queryCriterion, connection).parsedCriterion(), updateMetaData, dataProduction).update(); } private void stopIfTableDataNotFound(ParsedQueryCriterion parsedQueryCriterion, Connection connection) throws TableDataNotFoundException, Exception { Long count = count(parsedQueryCriterion.parsedCriterion(), connection); if (count == 0) { throw new TableDataNotFoundException("Aucune valeur trouvée dans la table pour les critères indiqués"); } } private void stopIfNotOneTableDataFound(ParsedQueryCriterion parsedQueryCriterion, Connection connection) throws TableDataNotFoundException, Exception { Long count = count(parsedQueryCriterion.parsedCriterion(), connection); if (count != 1) { throw new MoreThanOneTableDataNotFoundException("Plus d'une ligne trouvée dans la table pour les critères indiqués"); } } }