maia_modificado/.svn/pristine/fc/fccf84ac31c22e072e642f4e4c4...

260 lines
10 KiB
Plaintext
Executable File

package com.fp.general.score.save;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.sql.Date;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.apache.commons.lang.StringUtils;
import com.fp.common.exception.ExceptionHandler;
import com.fp.common.logger.APPLogger;
import com.fp.dto.save.SaveRequest;
import com.fp.loan.exception.LoanException;
import com.fp.persistence.commondb.PersistenceHelper;
import com.fp.persistence.commondb.PersistenceManager;
import com.fp.persistence.commondb.data.SessionData;
import com.fp.persistence.commondb.data.ThreadFacade;
import com.fp.persistence.commondb.helper.FormatDates;
import com.fp.persistence.pgeneral.score.TgeneScoreAdjustment;
//import com.fp.persistence.ploan.acco.TloanPaymentBankProcess;
/**
* Clase que se encarga de procesar un archivo con información de pagos de créditos procedente de una canal de
* recaudación
*
* @author Omar Villanueva
* @version 2.1
*/
public class UploadFileScoreThread extends Thread {
private final Integer company;
/* Arvhivo a procesar */
private final File file;
/* Institución financiera a la que pertenece el archivo */
private final String bank;
/* Directorio destino para el archivo luego de procesarlo */
private final StringBuilder targetPath;
/*
* Map para los formatos de nombres de archivos de las instituciones financieras parametrizadas en
* TLOANPAYMENTACCOBANK
*/
private final Map<String, String> mFileName;
/*
* Map para los numeros de hilos que se puede procesar en paralelo por cada una de las instituciones financieras
* parametrizadas en TLOANPAYMENTACCOBANK
*/
private final Map<String, Integer> mThreads;
/* String para almacenar el log de errores en la carga de los archivos para mostrar al usuario en el front end */
private final StringBuilder sbLog;
/* Separador de linea */
private final String new_line = System.getProperty("line.separator");
private final SaveRequest sr;
/**
* Constructor
*
* @param company
* @param file
* @param bank
* @param targetPath
* @param mFileName
* @param mThreads
* @param sbLog
*/
public UploadFileScoreThread(Integer company, File file, String bank, StringBuilder targetPath, Map<String, String> mFileName,
Map<String, Integer> mThreads, StringBuilder sbLog, SaveRequest sr) {
super();
this.company = company;
this.file = file;
this.bank = bank;
this.targetPath = targetPath;
this.mFileName = mFileName;
this.mThreads = mThreads;
this.sbLog = sbLog;
this.sr=sr;
}
@Override
public void run() {
// boolean success = true;
try {
SessionData s = new SessionData();
s.setCompany(company);
ThreadFacade.setSaveRequest(s);
PersistenceHelper.setEntityManager(PersistenceManager.getInstance().createEntityManagerLocal());
PersistenceHelper.beginNewTransaction();
/* Procesar archivo */
process();
PersistenceHelper.commitNewTransaction();
/* Mover el archivo si la carga fue exitosa */
moveFile();
} catch (Exception e) {
// success = false;
PersistenceHelper.rollbackNewTransaction();
ExceptionHandler eh = new ExceptionHandler(e, "es");
APPLogger.getLogger().error("codigo ==>" + eh.getCode());
APPLogger.getLogger().error("user ==>" + eh.getUserMessage());
APPLogger.getLogger().error("technical ==>" + eh.getTechnicalMessage());
APPLogger.getLogger().error("stacktrace ==>" + eh.getStackTrace());
} finally {
PersistenceHelper.closeSession();
}
// /* Mover el archivo si la carga fue exitosa */
// if (success) {
// try {
// moveFile();
// } catch (Exception e) {
// e.printStackTrace();
// }
// }
}
/**
* Método que procesa el archivo. Carga la data en la tabla TGENESCOREADJUSTMENT(---TLOANPAYMENTBANKPROCESS). Lanza un hilo por cada linea
* que contiene el arvhivo. Se pueden lanzar varios hilos en paralelo. El numero máximo de hilos esta determinado
* por el parametro threads fijado en la tabla TLOANPAYMENTACCOBANK
*
* @throws Exception
*/
private void process() throws Exception {
/* Verificar si el archivo ya fue cargado anteriormente */
//String fileExist = TloanPaymentBankProcess.find(PersistenceHelper.getEntityManager(), company, file.getName());
String fileExist = TgeneScoreAdjustment.find(PersistenceHelper.getEntityManager(), company, file.getName());
if (fileExist != null) {
sbLog.append(new LoanException("LOAN-0049", "EL ARCHIVO: {0} YA FUE CARGADO ANTERIORMENTE", file.getName()).getMessage())
.append(new_line);
throw new LoanException("LOAN-0049", "EL ARCHIVO: {0} YA FUE CARGADO ANTERIORMENTE", file.getName());
}
/* Verificar si el numero de hilos esta definido */
if (mThreads.get(bank) == null || mThreads.get(bank).compareTo(0) <= 0) {
/* Agrega el mensaje al log de errores */
sbLog.append(
new LoanException("LOAN-0041", "NUMERO DE HILOS NO DEFINIDO EN TLOANPAYMENTACCOBANK PARA INSTITUCION FINANCIERA: {0}", bank)
.getMessage()).append(new_line);
throw new LoanException("LOAN-0041", "NUMERO DE HILOS NO DEFINIDO EN TLOANPAYMENTACCOBANK PARA INSTITUCION FINANCIERA: {0}", bank);
}
ExecutorService pool = Executors.newFixedThreadPool(mThreads.get(bank));
/* Obtener la fecha de pago del archivo a procesar */
Date paymentDate = getDateFromFile();
try {
BufferedReader input = new BufferedReader(new FileReader(file));
try {
String line = null;
int sequence = 0;
Timestamp realDate = FormatDates.getInstance().getDataBaseTimestamp();
while ((line = input.readLine()) != null) {
sequence++;
/* Se lanza un hilo por cada linea del archivo que se debe procesar */
UploadLineScoreThread ult = new UploadLineScoreThread(company, file, bank, line, sequence, realDate, paymentDate, sr);
pool.execute(ult);
}
} catch (IOException ioe) {
throw ioe;
} finally {
input.close();
}
} catch (IOException ioe) {
throw ioe;
}
pool.shutdown();
boolean isfinish = pool.isTerminated();
while (!isfinish) {
isfinish = pool.isTerminated();
Thread.sleep(600);
}
}
/**
* Método que obtiene la fecha desde el arvhivo proporcionado por el canal de recaudación. Esta es la fecha de pago
* de la cuota del crédito
*
* @return
* @throws Exception
*/
private Date getDateFromFile() throws Exception {
Date date = null;
String fileName = StringUtils.remove(mFileName.get(bank), '-');
int positionDate = fileName.indexOf("ddMM");
/* Procesa archivos que contengan el formato ddMM */
if (positionDate < 0) {
/* Agrega el mensaje al log de errores */
sbLog.append(
new LoanException("LOAN-0038", "FECHA INCORRECTAMENTE DEFINIDA EN TLOANPAYMENTACCOBANK PARA INSTITUCIÓN FINANCIERA: {0}", bank)
.getMessage()).append(new_line);
throw new LoanException("LOAN-0038", "FECHA INCORRECTAMENTE DEFINIDA EN TLOANPAYMENTACCOBANK PARA INSTITUCIÓN FINANCIERA: {0}", bank);
}
if (bank.compareTo("SP") == 0) {
String formatDate = mFileName.get(bank).substring(positionDate, positionDate + 10);
String strDate = file.getName().trim().substring(positionDate, positionDate + 10);
date = getDateByFormat(strDate, formatDate);
}
return date;
}
/**
* Método que devuelve la fecha según el formato requerido
*
* @param pStrDate
* @param pFormat
* @return
* @throws Exception
*/
private Date getDateByFormat(String pStrDate, String pFormat) throws Exception {
Date date = null;
try {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pFormat);
date = new Date(simpleDateFormat.parse(pStrDate).getTime());
} catch (Exception e) {
/* Agrega el mensaje al log de errores */
sbLog.append(
new LoanException(
"LOAN-0050",
"EL FORMATO DE FECHA DEL ARCHIVO: {0} NO COINCIDE CON EL DEFINIDO EN TLOANPAYMENTACCOBANK PARA INSTITUCIÓN FINANCIERA: {1}",
file.getName(), bank).getMessage()).append(new_line);
throw new LoanException("LOAN-0050",
"EL FORMATO DE FECHA DEL ARCHIVO: {0} NO COINCIDE CON EL DEFINIDO EN TLOANPAYMENTACCOBANK PARA INSTITUCIÓN FINANCIERA: {1}",
file.getName(), bank);
}
return date;
}
/**
* Método que mueve el archivo ya procesado al directorio destino
*
* @throws Exception
*/
private void moveFile() throws Exception {
/* Directorio destino */
File targetDir = new File(targetPath.toString());
/* Mover el archivo al nuevo directorio */
boolean success = file.renameTo(new File(targetDir, file.getName()));
if (!success) {
/* Agrega el mensaje al log de errores */
sbLog.append(new LoanException("LOAN-0040", "EL ARCHIVO {0} ESTA SIENDO USADO POR OTRO PROCESO", file.getName()).getMessage()).append(
new_line);
throw new LoanException("LOAN-0040", "EL ARCHIVO {0} ESTA SIENDO USADO POR OTRO PROCESO", file.getName());
}
}
}