/*
 * Creado el 18-mar-04
 *
 * Para cambiar la plantilla para este archivo generado vaya a
 * Ventana&gt;Preferencias&gt;Java&gt;Generación de código&gt;Código y comentarios
 */
package es.ejie.frmk.admon.logs;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

import es.ejie.frmk.Q70FactoriaConstantes;
import es.ejie.frmk.control.arranque.Q70GestorArranqueConfiguracionServidor;
import es.ejie.frmk.control.excepciones.Q70FrameworkException;
import es.ejie.frmk.infraestructura.logs.base.Q70ConfiguracionLog;
import es.ejie.frmk.infraestructura.logs.base.Q70ConfiguracionLogs;
import es.ejie.frmk.infraestructura.logs.base.Q70ConstantesLogs;

/**
 * @version 1.0 Fecha: 18-mar-04
 */
public class Q70ConsultorLogs implements Serializable{

	private static final long serialVersionUID = 1L;

	private Q70Filtros consultaLog = null;

	private String[] listaLogs = null;

	private String[] listaCols = null;
	
	private String codAplicacion = null;

	

	/**
	 * Permite establecer los filtros que se utilizarán para seleccionar apuntes de los Logs.
	 * 
	 * @param consultaLog
	 *            Filtros para realizar la query
	 */
	public void setFiltros(Q70Filtros consultaLog)
	{
		this.consultaLog = consultaLog;

	}

	/**
	 * Permite establecer los logs por los que se limitará la query
	 * 
	 * @param listLogs
	 *            ArrayList con los logs
	 */
	public void setLogsFiltro(String[] listLogs)
	{
		this.listaLogs = listLogs;

	}

	public String[] getLogsFiltro()
	{
		return this.listaLogs;
	}

	/**
	 * Permite establecer las columnas por las que se limitará la query. Estas columnas son los atributos genéricos de
	 * los logs seleccionados.
	 * 
	 * @param listCols
	 *            String[] con las columnas para el mensaje
	 */
	public void setColumnasFiltro(String[] listCols)
	{
		this.listaCols = listCols;

	}

	public String[] getColumnasFiltro()
	{
		return this.listaCols;
	}
	
	public String getCodAplicacion()
	{
		return codAplicacion;
	}

	public void setCodAplicacion(String codAplicacion)
	{
		this.codAplicacion = codAplicacion;
	}

	/**
	 * Ejecuta la busqueda basada en los filtros previamente establecidos. Recorre todas los logs y extrae de ellos
	 * todos los apuntes que cumplen con dichos filtros. El resultado lo devuelve en una lista ordenada por fecha.
	 * 
	 * @return Lista de elementos R09ApunteLog
	 */
	public List executeQuery() throws Q70FrameworkException
	{
		// lista de resultados
		List result = new ArrayList();
		List listaResultados = new ArrayList(this.getLogsFiltro().length);
		int tamanyoLogs = this.getLogsFiltro().length;
		for (int i = 0; i < tamanyoLogs; i++) {
			listaResultados.add(this.getLogsFiltro()[i]);
		}
		try {
			//recuperamos la configuración de la Traza para realizar la búsqueda
			if ((listaResultados.contains(Q70ConstantesLogs.TRAZA)) || (listaResultados.isEmpty())
					|| (listaResultados.get(0).toString().equals("TODOS_LOGS"))) {
				//Q70ConfiguracionLog configuracionTraza = Q70TrazaServidor.getSingleton().getConfiguracionLog();
				Q70ConfiguracionLog configuracionTraza = (Q70ConfiguracionLog)Q70GestorArranqueConfiguracionServidor.invokeMBeanPorTipoComponenteAplicacion(Q70FactoriaConstantes.ID_GESTOR_TRAZA, this.getCodAplicacion(), "getConfiguracionComponente", null, null);
					Q70Buscador buscador = Q70FactoriaBuscadores.getBuscador(Q70ConstantesLogs.TRAZA, configuracionTraza);
					if (buscador != null) {
						List elementos = buscador.ExecuteQuery(consultaLog);
						if (elementos != null && elementos.size() > 0) {
							result.addAll(elementos);
						}
					}
			}
			
			//Q70ConfiguracionLogs configuracionLogs = Q70GestorLogsServidor.getSingleton().getConfiguracionLogs();
			Q70ConfiguracionLogs configuracionLogs = (Q70ConfiguracionLogs)Q70GestorArranqueConfiguracionServidor.invokeMBeanPorTipoComponenteAplicacion(Q70FactoriaConstantes.ID_GESTOR_LOGS, this.getCodAplicacion(), "getConfiguracionComponente", null, null);
			Iterator iterator = configuracionLogs.getLogs();
			// recorrer la configuración de cada log para averiguar de donde sacar los datos.
			while (iterator.hasNext()) {
				// Obtener los datos de cada log.
				String logName = (String) iterator.next();
				if ((listaResultados.contains(logName)) || (listaResultados.isEmpty())
						|| (listaResultados.get(0).toString().equals("TODOS_LOGS"))) {
					Q70ConfiguracionLog configuracionLog = configuracionLogs.getConfiguracion(logName);
					Q70Buscador buscador = Q70FactoriaBuscadores.getBuscador(logName, configuracionLog);
					if (buscador != null) {
						List elementos = buscador.ExecuteQuery(consultaLog);
						if (elementos != null && elementos.size() > 0) {
							result.addAll(elementos);
						}
					}
				}
			}
	
			Collections.sort(result, new Q70LogDateComparator());
	}catch (Exception e) {
		throw new Q70FrameworkException(Q70ConstantesLogs.ID_COMPONENTE,this.getClass().toString(),"executeQuery","Se ha producido un error recuperando la configuración de logs y trazas para la aplicación "+this.getCodAplicacion(),null);
	}
		return result;
	}
}
