package es.ejie.frmk.control.monitor;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

import es.ejie.frmk.admon.logs.Q70ConsultorLogs;
import es.ejie.frmk.control.arranque.Q70Instancia;
import es.ejie.frmk.control.excepciones.Q70FrameworkException;
import es.ejie.frmk.infraestructura.seguridad.Q70SeguridadException;

public interface Q70BeanMonitorizacionMBean extends Serializable {

	/**
	 * Devuelve el total de la memoria libre.
	 * @return Memoria libre expresada en bytes
	 */
	public abstract long getMemorySpace();

	/**
	 * Devuelve el total de la memoria existente
	 * @return Memoria total expresada en bytes
	 */
	public abstract long getTotalMemory();

	/**
	 * Monitorización tiempos de acceso.
	 * @return Tiempos de acceso
	 */
	public abstract long getAverageAccessTime();

	/**
	 * Devuelve una lista de objetos de la clase <code>es.ejie.frmk.admon.contextos.Q70InformacionContexto</code> 
	 * con los usuarios activos en Geremua en el momento de la petición.
	 * 
	 * @return Lista con Recursos del Thread
	 */
	public abstract List getThreadResources();

	/**
	 * Libera los recursos reservados por un thread. 
	 * Elimina las conexiones de bbdd asociadas a un hilo de ejecución de Geremua. 
	 * 
	 * @param nameThread nombre del Thread en la JVM
	 */
	public abstract void removeThreadResources (String nameThread);
	
	
	/**
	 * Elimina la sesion de seguridad de un usuario y 
	 * desconecta al usuario de todas las instancias de Geremua que escuchen la misma cola JMS.
	 * 
	 * @param idContexto Identificativo del contexto 
	 */
	public abstract void doInvalidateUsuarioJMS(String idContexto) throws Q70SeguridadException;

	/**
	 * Las subclases deben sobreescribir este método indicando si la aplicación funciona correctamente o no.
	 * <p>
	 * Este método debe hacer una verificación sencilla del funcionamiento. Para una verificación más
	 * exhaustiva está el método <b>validarEstadoAplicacion</b>
	 * 
	 * @return String con el mensaje de verificacion devuelto por la aplicacion
	 */
	public abstract String consultarEstadoAplicacion();

	/**
	 * Validación profunda del estado de una aplicación.
	 * <p>
	 * Las subclases deben sobreescribir los métodos invocados
	 * por este: <b>validarConexionesABD</b> y <b>generarResultados</b>; construyendo
	 * una lista con los problemas que tengan para funcionar correctamente
	 * 
	 * @return Lista con los problemas que tengan para funcionar correctamente
	 */
	public abstract Object[] validarEstadoAplicacion();

	/**
	 * Las subclases deben sobreescribir este método si quieren refrescar los datos que consideren oportunos.
	 * 
	 * @return Lista con los resultados del refresco
	 */
	public abstract List refrescarEstadoAplicacion();

	/**
	 * Los beans de monitorización que tengan su fichero de resultados
	 * con distinto nombre al que se devuelve deben sobreescribir este método.
	 * Es el caso de aplicaciones con más de un bean de monitorización
	 * (uno por war)
	 * @return Nombre del fichero de resultados
	 */
	public abstract String getNombreFicheroResultados();

	
	/**
	 * Recupera un String con el contendido xml del fichero de configuracion del componente,
	 * cuyo nombre se pasa por parametro. Este nombre coincide con el usado en el fichero de configuracion
	 * del Gestor de Arranque y Configuracion.
	 * 
	 * @param nombreComponente Nombre del componente
	 * @return String con el contendido xml del fichero de configuracion del componente
	 * @throws Q70FrameworkException
	 */
	public String recuperaConfiguracionComponente(String nombreComponente) throws Q70FrameworkException;
	
	
	/**
	 * Recupera un String con el contenido del fichero de propiedades de la aplicación
	 * cuyo código se pasa por parametro. 
	 * 
 	 * @param codigoAplicacion Codigo de la aplicacion
	 * @return String con el contenido del fichero de propiedades
	 * @throws Q70FrameworkException
	 */
	public String recuperaFicheroPropiedades(String codigoAplicacion) throws Q70FrameworkException;
	
	/**
	 * Reconfigura un Componente con el string pasado por paramtro. Graba el fichero de configuracion del componente
	 * con el string que contiene la configuracion modificada contendido xml. Este nombre de Componente 
	 * coincide con el usado en el fichero de configuracion del Gestor de Arranque y Configuracion.
	 * 
	 * @param nombreComponente Nombre del componente
	 * @param xmlConfiguracion String que contiene la configuracion modificada contendido xml
	 * @return
	 * @throws Q70FrameworkException
	 */
	public boolean reconfigurarComponente(String nombreComponente, String xmlConfiguracion) throws Q70FrameworkException;
	
	/**
	 * Reconfigura un Fichero de Propiedades con el String pasado como parámetro. Graba el fichero de propiedades
	 * con el String que contiene el contenido actualizado. Configuracion.
	 * 
 	 * @param codigoAplicacion Codigo de la aplicacion
	 * @param xmlConfiguracion String que contiene la configuracion modificada contendido xml
	 * @throws Q70FrameworkException
	 */
	public boolean reconfigurarFicheroPropiedades(String codigoAplicacion, String xmlConfiguracion) throws Q70FrameworkException;
	
	
	/**
	 * Recupera los códigos de aplicación de las aplicaciones pertenecientes a una instancia concreta, 
	 * pasada como parámetro
	 * 
	 * @param instancia Instancia de Geremua
	 * @return Lista con las Aplicaciones de la instancia pasada por parámetro
	 * @throws Q70FrameworkException
	 */
	public Collection getAplicacionesInstancia(Q70Instancia instancia) throws Q70FrameworkException;
	
	/**
	 * Recupera una lista con las entradas de logs y trazas filtradas por los criterios establecidos
	 * en el componente de tipo Q70ConsultorLogs pasado como parámetro
	 * 
	 * @param consultorLogs Objeto con los criterios de busqueda
	 * @return Lista con el resultado de la búsqueda
	 * @throws Q70FrameworkException
	 */
	public List getListaLogsTraza(Q70ConsultorLogs consultorLogs) throws Q70FrameworkException;
	
	/**
	 * Recupera los contextos globales
	 * 
	 * @return Lista de los contextos globales de la instancia
	 * @throws Q70SeguridadException
	 */
	public Collection getContextosGlobales() throws Q70SeguridadException;
	
	/**
	 * Recupera los contextos de usuario activos en Geremua
	 * 
	 * @return Lista de los contextos de usuario activos en Geremua
	 */
	public abstract Collection getContextosUsuarios();
	
	/**
	 * Recupera el contexto de usuario
	 * 
	 * @param idContexto Identificativo del contexto 
	 * @return String con el contenido del contexto de usuario
	 */
	public String getContextoUsuario(String idContexto);
	
	/**
	 * Recupera el contexto global
	 * 
	 * @param tipoContexto Tipo del contexto
	 * @param idContexto Identificativo del contexto 
	 */
	public List getContextoGlobal(String tipoContexto, String idContexto);	

	/**
	 * Modifica el contexto global
	 * 
	 * @param tipoContexto Tipo del contexto
	 * @param idContexto Identificativo del contexto 
	 * @param atributos Lista de atributos 
	 * @param valores Lista de valores modificados
	 */	
	public void modificarContextoGlobal(String tipoContexto, String idContexto, Collection atributos, Collection valores);

	/**
	 * Recupera de bbdd el contexto para actualizarlo.
	 * 
	 * @param tipoContexto Tipo del contexto
	 * @param idContexto Identificativo del contexto 
	 * 
	 * @return Devuelve una lista con los atributos y sus valores actuales del contexto.
	 */	
	public List refrescarContextoGlobal(String tipoContexto, String idContexto);
}