package com.fp.bpm.actions; import java.math.BigDecimal; import java.sql.Date; import java.sql.SQLException; import java.util.List; import org.apache.commons.lang.time.StopWatch; import com.fp.bpm.ActionExecutor; import com.fp.bpm.helper.TransactionTime; import com.fp.bpm.query.QueryProcessor; import com.fp.common.exception.APPException; import com.fp.common.exception.ExceptionHandler; import com.fp.common.fin.MessageGenerator; import com.fp.common.logger.APPLogger; import com.fp.dto.Request; import com.fp.dto.Response; import com.fp.dto.data.SaveData; import com.fp.dto.helper.FileHelper; import com.fp.dto.json.Serializer; import com.fp.dto.query.QueryRequest; import com.fp.general.exception.GeneralException; import com.fp.persistence.commondb.helper.FormatDates; /** * Clase que se encarga del manejo de querys en la aplicacion */ public class QueryAction extends ActionExecutor { /** * Metodo que ejecuta el jason enviado desde la web * * @param pRequest Json que viaja desde la aplicacion * @return * @throws Exception */ @Override public String execute(String pRequest, List fileItem) throws Exception { Serializer ser = new Serializer(pRequest); QueryRequest qr = (QueryRequest) ser.toObject(QueryRequest.class); Response res = new Response(Response.RESPONSE_OK, "OK"); // fija numero de mensaje MessageGenerator mg = MessageGenerator.getInstance(); qr.setJournalId(mg.generateId(qr.getUser())); // Log de transaccion super.request = qr; // fija transaccion original super.fillOriginalTransaction(); super.requestToLog(); // fin log transaccion // Inicializa datos para el log de la transaccion. this.fillThreadData(pRequest); if (TransactionTime.verifyTransactionTime(null, qr)) { qr.setResponse(res); QueryProcessor qp = new QueryProcessor(); qp.process(qr); } else { res = new Response("CORE-005", "TRANSACCION FUERA DE HORARIO: " + qr.getTransactionModule() + " TRANSACCION: " + qr.getTransactionCode() + " VERSION: " + qr.getTransactionVersion()); } // res.changeAbstractBeanToMap(); ser = new Serializer(res); return ser.toJSON(); } /** * Metodo que almacena en SaveData, los datos del saverequest de entrada. * * @throws Exception */ private void fillThreadData(String pData) throws Exception { // Inicializa el thread local. SaveData.setSaveRequest(null); // Almacena string de datos de entrada en el thread local, se utiliza para llenar if (SaveData.getOriginalString() == null) { // En producccion se almacena en el EngineExecutor SaveData.setOriginalString(pData); } } public Object process(Request request) throws Exception { Response response = new Response(Response.RESPONSE_OK, "OK"); StopWatch sw = null; boolean error = false; try { sw = new StopWatch(); sw.start(); this.execute(request, response); sw.stop(); } catch (Throwable e) { error = true; try { if (sw != null) { sw.stop(); } } catch (IllegalStateException e1) { // o hacer nada el stopwatch ya esta detenido } this.fillError(e, response); //retorn excepcion para que no haga commit el ejb querybean throw e; } finally { try { if (!error) { super.saveLog(this.getTime(sw), "Q"); } else { super.saveLogWithCommit(this.getTime(sw), "Q", response.getResponseCode(), response.getResponseUserMessage(), null, null); } } catch (Exception e2) { APPLogger.getLogger().error("ERROR GRABANDO LOG AUDITORIA \n"); } } return response; } private void execute(Request request, Response response) throws Exception { QueryRequest qr = new QueryRequest(); request.copy(qr); request.copyMapValues(qr); qr.setQueryTables(request.getQueryTables()); qr.setJsf(true); qr.setResponse(response); qr.putAll(request.getModifiedData()); //campos del request codigo de consuta. // fija numero de mensaje MessageGenerator mg = MessageGenerator.getInstance(); qr.setJournalId(mg.generateId(qr.getUser())); // Log de transaccion super.request = qr; // fija transaccion original super.fillOriginalTransaction(); super.requestToLog(); // fin log transaccion if (TransactionTime.verifyTransactionTime(null, qr)) { QueryProcessor qp = new QueryProcessor(); qp.process(qr); } else { throw new GeneralException("CORE-0054", "TRANSACCIÓN FUERA DE HORARIO MODULO: {0} TRANSACCIÓN: {1} VERSIÓN: {2}", qr.getTransactionModule(), qr.getTransactionCode(), qr.getTransactionVersion()); } } /** * Obtiene el tiempo de respuesta resultado de la ejecucion de una transaccion. * * @param sw Objeto que contiene el tiempo de ejecucion de una transaccion. * @return BigDecimal * @throws Exception */ private BigDecimal getTime(StopWatch sw) throws Exception { Date d = new Date(sw.getTime()); return new BigDecimal(FormatDates.getInstance().getTimeInSeconds().format(d)); } private void fillError(Throwable e,Response response) throws Exception { ExceptionHandler eh = new ExceptionHandler(e, "es"); APPLogger.getLogger().error("User Message:==>\n" + eh.getUserMessage()); response.setResponseCode(eh.getCode()); response.setResponseUserMessage(eh.getUserMessage()); response.setIsAplicationMessage(eh.isAppexception()); if ((e instanceof APPException) || (e instanceof SQLException)) { response.setResponseStack(eh.getTechnicalMessage()); } else { response.setResponseStack( eh.getStackTrace().length() > 1536 ? eh.getStackTrace().substring(0, 1536) : eh.getStackTrace()); APPLogger.getLogger().error("StackTrace:==>" + response.getResponseStack()); } } }