package com.megatim.apifdxweb.service.impl.scheduler; import com.megatim.apifdxweb.core.ifaces.tmp.TokenTmpManager; import com.megatim.apifdxweb.core.ifaces.tmp.TypeFichierDataTmpManager; import com.megatim.apifdxweb.model.tmp.StatutTmp; import com.megatim.apifdxweb.model.tmp.TokenTmp; import com.megatim.apifdxweb.model.tmp.TypeFichierDataTmp; import com.megatim.apifdxweb.service.ifaces.scheduler.TypeFichierDataTmpJob; import com.megatim.apifdxweb.tools.AppContext; import com.megatim.fdxcommons.core.ifaces.helper.DataInMemoryHandler; import com.megatim.fdxcommons.model.dataproduction.DataProduction; import java.util.LinkedHashMap; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javax.enterprise.context.Dependent; import javax.inject.Inject; import javax.transaction.Transactional; import com.megatim.fdxcommons.model.dataproduction.DataProductionSource; import com.megatim.fdxcommons.tools.database.connection.DBConnection; import com.megatim.fdxcommons.tools.database.tables.FdxApiTable; import java.sql.Connection; import java.sql.SQLException; import java.time.LocalDateTime; import javax.annotation.Resource; import javax.naming.NamingException; import javax.sql.DataSource; /** * * @author ASUS */ @Dependent public class TypeFichierDataTmpJobImpl implements TypeFichierDataTmpJob { @Inject private TokenTmpManager tokenTmpManager; @Inject private TypeFichierDataTmpManager dataTmpManager; @Inject private DataInMemoryHandler dataInMemoryHandler; @Resource(lookup = AppContext.JNDI_NAME) private DataSource dataSource; @Override public void mergeData() { List tokens = tokenTmpManager.getByStatutTmp(StatutTmp.ACHEVE); tokens.stream().forEach(t -> { try { List> data = dataTmpManager.getByStructuredLines(t.getToken(), t.getCodeTypeFichier()); updateDatabase(data, t); } catch (Exception ex) { Logger.getLogger(TypeFichierDataTmpJobImpl.class.getName()).log(Level.SEVERE, ex.getMessage(), ex); } }); } @Override @Transactional public void deleteExpiredTokens() { List tokenExpired = tokenTmpManager.getExpiredToken(); for (TokenTmp t : tokenExpired) { List data = dataTmpManager.getByToken(t.getToken()); for (TypeFichierDataTmp d : data) { dataTmpManager.delete(d); } tokenTmpManager.delete(t); } } @Transactional private void updateDatabase(List> data, TokenTmp tokenTmp) throws Exception { insert(tokenTmp.getCodeTypeFichier(), dataInMemoryHandler.getDataInMemory().getReferentielEnCours().getVersion(), data, tokenTmp.getCodeParticipant()); deleteTokenTmp(tokenTmp); } private void insert(String codeTypeFichier, String referentielVersion, List> data, String connectedParticipant) throws SQLException, NamingException, Exception { DataProduction dataProduction = newDataProduction(codeTypeFichier, connectedParticipant, referentielVersion); try ( Connection connection = new DBConnection(dataSource).connection()) { connection.setAutoCommit(false); new FdxApiTable(codeTypeFichier, referentielVersion, connection) .insert(data, dataProduction); connection.commit(); } } private void deleteTokenTmp(TokenTmp tokenTmp) { List dataTmp = dataTmpManager.getByToken(tokenTmp.getToken()); for (TypeFichierDataTmp td : dataTmp) { dataTmpManager.delete(td); } TokenTmp t = tokenTmpManager.getById(tokenTmp.getToken()); tokenTmpManager.delete(t); } private DataProduction newDataProduction(String codeTypeFichier, String codeParticipant, String referentielVersion) { DataProduction dataProduction = new DataProduction(); dataProduction.setDateProduction(LocalDateTime.now()); dataProduction.setReferentielVersion(referentielVersion); dataProduction.setCodeTypeFichier(codeTypeFichier); dataProduction.setCodeParticipant(codeParticipant); dataProduction.setSource(DataProductionSource.API); return dataProduction; } }