package com.megatim.apifdxweb.core.impl.helper; import com.megatim.apifdxweb.core.ifaces.helper.DataProductionOperations; import com.megatim.apifdxweb.core.ifaces.helper.RoutingChecker; import com.megatim.apifdxweb.model.request.UpdateRequest; import com.megatim.apifdxweb.tools.AppContext; import com.megatim.commons.tools.exceptions.ApplicationServerException; import com.megatim.fdxcommons.core.ifaces.helper.DataInMemoryHandler; import com.megatim.fdxcommons.model.dataproduction.DataProduction; import com.megatim.fdxcommons.model.dataproduction.DataProductionSource; import com.megatim.fdxcommons.model.pojo.CriteriaEntityFromView; import com.megatim.fdxcommons.tools.database.connection.DBConnection; import com.megatim.fdxcommons.tools.database.queries.metadata.QueryCriterion; import com.megatim.fdxcommons.tools.database.tables.FdxApiTable; import com.megatim.fdxcommons.tools.exceptions.CommonRessourceNotFoundException; import com.megatim.fdxcommons.tools.utils.CriteriaEntityFromViewToQueryCriterion; import java.sql.Connection; import java.time.LocalDateTime; import java.util.LinkedHashMap; import java.util.List; import javax.annotation.Resource; import javax.enterprise.context.Dependent; import javax.inject.Inject; import javax.sql.DataSource; /** * * @author Gabuntu */ @Dependent public class DataProductionOperationsImpl implements DataProductionOperations { @Resource(lookup = AppContext.JNDI_NAME) private DataSource dataSource; @Inject private DataInMemoryHandler dataInMemoryHandler; @Inject private RoutingChecker routingChecker; @Override public void saveAll(String codeTypeFichier, List> datas, String connectedParticipant) { stopIfProductionNotPermitted(codeTypeFichier, connectedParticipant); try ( Connection connection = new DBConnection(dataSource).connection()) { connection.setAutoCommit(false); DataProduction dataProduction = newDataProduction(codeTypeFichier, connectedParticipant); table(connection, codeTypeFichier).insert((List>) datas, dataProduction); connection.commit(); } catch (Exception ex) { throw new ApplicationServerException(ex.getMessage()); } } @Override public void saveOne(String codeTypeFichier, LinkedHashMap data, String connectedParticipant) { stopIfProductionNotPermitted(codeTypeFichier, connectedParticipant); try ( Connection connection = new DBConnection(dataSource).connection()) { connection.setAutoCommit(false); DataProduction dataProduction = newDataProduction(codeTypeFichier, connectedParticipant); table(connection, codeTypeFichier).insert(data, dataProduction); connection.commit(); } catch (Exception ex) { throw new ApplicationServerException(ex.getMessage()); } } @Override public void updateAll(String codeTypeFichier, UpdateRequest updateRequest, String connectedParticipant) { stopIfProductionNotPermitted(codeTypeFichier, connectedParticipant); try ( Connection connection = new DBConnection(dataSource).connection()) { connection.setAutoCommit(false); QueryCriterion queryCriterion = new CriteriaEntityFromViewToQueryCriterion(updateRequest.getCriteriaEntityFromView()).queryCriterion(); table(connection, codeTypeFichier).update(updateRequest.getDataToUpdate(), queryCriterion); connection.commit(); } catch (Exception ex) { throw new ApplicationServerException(ex.getMessage()); } } @Override public void updateOne(String codeTypeFichier, UpdateRequest updateRequest, String connectedParticipant) { stopIfProductionNotPermitted(codeTypeFichier, connectedParticipant); try ( Connection connection = new DBConnection(dataSource).connection()) { connection.setAutoCommit(false); QueryCriterion queryCriterion = new CriteriaEntityFromViewToQueryCriterion(updateRequest.getCriteriaEntityFromView()).queryCriterion(); table(connection, codeTypeFichier).updateOne(updateRequest.getDataToUpdate(), queryCriterion); connection.commit(); } catch (Exception ex) { throw new ApplicationServerException(ex.getMessage()); } } @Override public void deleteAll(String codeTypeFichier, CriteriaEntityFromView criterionFromView, String connectedParticipant) { stopIfProductionNotPermitted(codeTypeFichier, connectedParticipant); try ( Connection connection = new DBConnection(dataSource).connection()) { connection.setAutoCommit(false); QueryCriterion queryCriterion = new CriteriaEntityFromViewToQueryCriterion(criterionFromView).queryCriterion(); table(connection, codeTypeFichier).delete(queryCriterion); connection.commit(); } catch (Exception ex) { throw new ApplicationServerException(ex.getMessage()); } } @Override public void deleteOne(String codeTypeFichier, CriteriaEntityFromView criterionFromView, String connectedParticipant) { stopIfProductionNotPermitted(codeTypeFichier, connectedParticipant); try ( Connection connection = new DBConnection(dataSource).connection()) { connection.setAutoCommit(false); QueryCriterion queryCriterion = new CriteriaEntityFromViewToQueryCriterion(criterionFromView).queryCriterion(); table(connection, codeTypeFichier).deleteOne(queryCriterion); connection.commit(); } catch (Exception ex) { throw new ApplicationServerException(ex.getMessage()); } } private FdxApiTable table(Connection connection, String codeTypeFichier) { return new FdxApiTable(codeTypeFichier, versionReferentiel(), connection); } private DataProduction newDataProduction(String codeTypeFichier, String codeParticipant) { DataProduction dataProduction = new DataProduction(); dataProduction.setDateProduction(LocalDateTime.now()); dataProduction.setReferentielVersion(versionReferentiel()); dataProduction.setCodeTypeFichier(codeTypeFichier); dataProduction.setCodeParticipant(codeParticipant); dataProduction.setSource(DataProductionSource.API); return dataProduction; } private String versionReferentiel() { return dataInMemoryHandler.getDataInMemory().getReferentielEnCours().getVersion(); } private void stopIfProductionNotPermitted(String codeTypeFichier, String connectedParticipant) { if (dataInMemoryHandler.getDataInMemory().getReferentielEnCours() == null) { throw new CommonRessourceNotFoundException("Aucun référentiel en cours"); } routingChecker.stopIfTypeFichierNotExists(codeTypeFichier, dataInMemoryHandler.getDataInMemory()); routingChecker.stopIfNotProducer(codeTypeFichier, dataInMemoryHandler.getDataInMemory(), connectedParticipant); } }