package com.fp.general.security.rules;

import javax.persistence.EntityManager;
import javax.persistence.Query;

import com.fp.common.exception.ExceptionHandler;
import com.fp.common.logger.APPLogger;
import com.fp.persistence.commondb.PersistenceHelper;
import com.fp.persistence.commondb.helper.FormatDates;

/**
 * Clase que cierra todas las conexiones abiertas en el servidor
 * @author scastillo
 */
public class CloseAllSessions {

    /**
     * Almacena una instancia de CloseAllSessions.
     */
    private static CloseAllSessions cache;

    /**
     * Entrega una instancia de CloseAllSessions.
     * @return	DataHelper
     */
    public static CloseAllSessions getInstance() {
        if (cache != null) {
            return cache;
        }
        synchronized (CloseAllSessions.class) {
            if (cache == null) {
                cache = new CloseAllSessions();
            }
        }
        return cache;
    }
    /**
     * Sentencia SQL que caduca las sesiones
     */
    private static final String SQL =
            "update TsafeUserSession set pk.dateto = :dateto where pk.dateto = :datetofilter and webserverip = :webserverip";

    /**
     * Metodo que cierra las sesiones abiertas en el servidor
     * @param host
     * @throws Exception
     */
    public void expireSessions(String host) throws Exception {
        EntityManager em = PersistenceHelper.getEntityManager();
        try {
            Query query = em.createQuery(SQL);
            query.setParameter("dateto", FormatDates.getInstance().getDataBaseTimestamp(em));
            query.setParameter("datetofilter", FormatDates.getDefaultExpiryTimestamp());
            query.setParameter("webserverip", host);
            query.executeUpdate();
        } catch (Exception e) {
            ExceptionHandler eh = new ExceptionHandler(e, "es");
            APPLogger.getLogger().error("User Message:==>\n" + eh.getUserMessage());
            APPLogger.getLogger().error("Tech Message:==>\n" + eh.getTechnicalMessage());
            APPLogger.getLogger().error("Stack Message:==>\n" + eh.getStackTrace());
        }
    }
}
