package br.ufrgs.inf.prosoft.tigris.monitoring.usersession;


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.lang.reflect.InvocationTargetException;

/**
 * The type Spring user getter.
 */
public class SpringUserGetter implements UserGetter {

    private final Object auth;
    /**
     * The Logger.
     */
    Logger logger = LoggerFactory.getLogger(SpringUserGetter.class);

    /**
     * Instantiates a new Spring user getter.
     *
     * @throws NoSuchMethodException     the no such method exception
     * @throws ClassNotFoundException    the class not found exception
     * @throws IllegalAccessException    the illegal access exception
     * @throws InstantiationException    the instantiation exception
     * @throws InvocationTargetException the invocation target exception
     */
    public SpringUserGetter() throws NoSuchMethodException, ClassNotFoundException, IllegalAccessException, InstantiationException, InvocationTargetException {
        Object contextHolder = Class.forName("org.springframework.security.core.context.SecurityContextHolder").newInstance();
        Object context = contextHolder.getClass().getMethod("getContext").invoke(contextHolder);
        auth = context.getClass().getMethod("getAuthentication").invoke(context);
    }

    @Override
    public String getCurrentUser() {
        try {
            return (String) auth.getClass().getMethod("getName").invoke(auth);
        } catch (Exception e) {
            logger.debug("Not able to get the current user.", e);
        }
        return "Anonymous";
    }
}
