package com.fp.bpm.query; import java.util.List; import java.util.Map; import com.fp.common.exception.CommonException; import com.fp.common.exception.SavePointException; import com.fp.common.logger.APPLogger; import com.fp.dto.query.QueryBean; import com.fp.dto.query.QueryRequest; import com.fp.dto.rules.QueryRule; import com.fp.dto.rules.TransactionRule; import com.fp.persistence.commondb.db.DataHelper; import com.fp.persistence.commondb.exception.CommondbException; import com.fp.persistence.pgeneral.gene.TgeneQueryProcess; import com.fp.persistence.pgeneral.gene.TgeneTransactionQuery; /** * Motor de consultas, el proceso se ejecuta de acuerodo a querytype.
* * @author Jorge Vaca * @version 2.1 */ public class QueryProcessor { /** Objeto con beans utilizados en el proceso de consulta. */ private QueryRequest queryRequest; /** * Metodo que se encarga de ejecutar consultas contra la base de datos, adicionalmente ejecuta consultas especiales * si estas estarian parametrizadas. Proceso tipo de consulta.
* "P" Ejecuta consulta por reglas asociadas a un codigo de consulta. "T" Ejecuta consulta por reglas asociadas a la * transaccion. "N" Ejecuta consultas genericas. * * @param pQueryRequest Objeto con beans utilizados en el proceso de consulta. * @param pResponse Objeto en el cual se alamcena la respuesta de una transaccion. * @return boolean * @throws CommondbException * @throws Exception */ public boolean process(QueryRequest pQueryRequest) throws CommondbException, Exception { Thread.currentThread().setName(pQueryRequest.getJournalId()); this.queryRequest = pQueryRequest; String queryType = (String) pQueryRequest.get("querytype"); if ((queryType == null) || (queryType.compareTo("N") == 0)) { if(!pQueryRequest.isJsf()){ Query qry = new Query(); qry.process(pQueryRequest); }else{ QueryJsf qry = new QueryJsf(); qry.execute(pQueryRequest); } } // Ejecuta consultas especiales para una transaccion. if ((queryType != null) && (queryType.compareTo("T") == 0)) { this.processByTransaction(); } // Ejecuta consultas especiales para un codigo de query. if ((queryType == null) || (queryType.compareTo("P") == 0)) { // Si es null entra el contro esta en el metodo interno this.processQueryByAlias(); } return true; } /** * Metodo que se encarga de ejecutar comandos especiales de consulta por queryalias. * * @param pQueryRequest Objeto con beans utilizados en el proceso de consulta. * @param pResponse Objeto que contiene los datos de respuesta de la consulta. * @throws Exception */ public void processQueryByAlias() throws Exception { Map bean = this.queryRequest.getBeans(); for (String k : bean.keySet()) { QueryBean qbean = bean.get(k); if (qbean.getQueryalias() != null) { this.processByQueryCode(qbean.getQueryalias()); } } String queryalias = (String) this.queryRequest.get("queryalias"); if (queryalias != null) { this.processByQueryCode(queryalias); } } /** * Fija un nuevo valor en queryRequest * * @param pQueryRequest nuevo valor para queryRequest */ public void setQueryRequest(QueryRequest pQueryRequest) { this.queryRequest = pQueryRequest; } /** * Metodo que se encarga de ejecutar procesos especiales de consulta por codigo de consulta. * * @param pQueryRequest Objeto con beans utilizados en el proceso de consulta. * @param pQueryCode Codigo de consulta. * @throws Exception */ private void processByQueryCode(String pQueryCode) throws Exception { List lprocess = DataHelper.getInstance().getTgeneQueryProcess(pQueryCode); if (lprocess == null) { return; } for (TgeneQueryProcess obj : lprocess) { this.processByCode(obj.getProcesscode(), pQueryCode); } } /** * * @param pResponse Objeto con beans utilizados en el proceso de consulta. * @param pProcess Codigo de proceso a ejecutar. * @param pQueryCode Codigo de consulta. * @throws Exception */ private void processByCode(String pProcess, String pQueryCode) throws Exception { QueryRule rule = null; try { rule = (QueryRule) Class.forName(pProcess).newInstance(); } catch (ClassNotFoundException e) { throw new CommonException("COMMON-0012", "CLASE {0} A EJECUTAR NO EXISTE CODE: {0}", e, pQueryCode); } catch (ClassCastException e) { throw new CommonException("COMMON-0013", "PROCESO {0} A EJECUTAR CODE: {1} NO IMPLEMENTA QUERYRULE", e, pProcess, pQueryCode); } APPLogger.getLogger().info("INICIO ==> " + rule); rule.process(this.queryRequest); APPLogger.getLogger().info("FIN ==> " + rule); } /** * Metodo que ejecuta procesos especiales de consulta por transaccion. * * @param pQueryRequest Objeto con beans utilizados en el proceso de consulta. * @throws Exception */ private void processByTransaction() throws Exception { if ((this.queryRequest.getTransactionModule() == null) || (this.queryRequest.getTransactionCode() == null)) { return; } List lquery = DataHelper.getInstance().getTgeneTransactionQuery(this.queryRequest.getTransactionModule(), this.queryRequest.getTransactionCode(), this.queryRequest.getTransactionVersion()); if (lquery == null) { return; } for (TgeneTransactionQuery obj : lquery) { try { this.processByTransactionRule(obj); } catch (SavePointException e) { // Detiene la ejecucion de componentes de negocio y graba la transaccion. break; } } } /** * Metodo encargado de ejecutar cada una de las reglas definidas en la transaccion. * * @param pSaveRequest Objeto con beans utilizados en el proceso de una transaccion. * @param pProcess Objeto que contiene la regla a ejecutar. * @throws Exception */ private void processByTransactionRule(TgeneTransactionQuery pQuery) throws Exception { QueryRule rule = null; try { rule = (QueryRule) Class.forName(pQuery.getProcesscode()).newInstance(); } catch (ClassNotFoundException e) { throw new CommonException("COMMON-0014", "CLASE {0} A EJECUTAR NO EXISTE MODULE: {1} TRANS: {2} VERSION {3}", e, pQuery.getProcesscode(), this.queryRequest.getTransactionModule(), this.queryRequest.getTransactionCode(), this.queryRequest.getTransactionVersion()); } catch (ClassCastException e) { throw new CommonException("COMMON-0015", "PROCESO {0} A EJECUTAR MODULE: {1} TRANS: {2} VERSION {3} NO IMPLEMENTA {4}", e, pQuery.getProcesscode(), this.queryRequest.getTransactionModule(), this.queryRequest.getTransactionCode(), this.queryRequest.getTransactionVersion(), TransactionRule.class.getName()); } rule.setFlow(pQuery.getProcessname()); rule.setRule(pQuery.getRulename()); APPLogger.getLogger().info("INICIO ==> " + rule); rule.process(this.queryRequest); APPLogger.getLogger().info("FIN ==> " + rule); } }