All Downloads are FREE. Search and download functionalities are using the official Maven repository.

framework.Session Maven / Gradle / Ivy

package framework;

import java.io.Serializable;
import java.util.Arrays;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;

import app.config.Sys;
import app.model.Account;
import framework.annotation.Job;
import framework.annotation.Only.Administrator;

/**
 * session scoped object
 */
@SuppressWarnings("serial")
public abstract class Session implements Attributes {

    /**
     * Session store interface
     */
    public interface Store extends AutoCloseable {

        /**
         * @param id Session id
         * @return Key values
         */
        Map load(String id);

        /**
         * @param id Session id
         * @param keyValues Save key-values
         * @param removeKeys Remove keys
         */
        void save(String id, Map keyValues, Set removeKeys);
    }

    /**
     * Locale
     */
    protected Locale locale = null;

    /**
     * @return Locale
     */
    public Locale getLocale() {
        return locale;
    }

    /**
     * @return Locale
     */
    public static Locale currentLocale() {
        return current().map(Session::getLocale).filter(Objects::nonNull).orElse(Locale.getDefault());
    }

    /**
     * current session
     */
    transient static final ThreadLocal CURRENT = new ThreadLocal<>();

    /**
     * @return current session
     */
    public static Optional current() {
        return Tool.of(CURRENT.get());
    }

    /**
     * session key of account
     */
    public static final String sessionKey = "$account$";

    /**
     * @return account
     */
    public Account getAccount() {
        return this.getAttr(sessionKey).orElse(Account.GUEST);
    }

    /**
     * @return is logged in
     */
    public boolean isLoggedIn() {
        return getAttr(sessionKey).isPresent();
    }
    
    /**
     * @return True if Administrator
     */
    public boolean isAdmin() {
        return getAccount().hasAnyRole(Administrator.class);
    }

    /**
     * @param loginId login id
     * @param password password
     * @return true if success, else failure
     */
    public boolean login(String loginId, String password) {
        Optional a = Try
                .s(() -> Reflector.>invoke(Sys.login_method, Tool.array(String.class, String.class), loginId, password)).get();
        return Tool.ifPresentOr(a, i -> {
            setAttr(sessionKey, i);
            Job.Scheduler.trigger(Job.OnLoggedIn);
            Log.info("logged in : " + i.id + Arrays.toString(i.roles));
        }, () -> Log.info("login failed: " + loginId));
    }

    /**
     * @return login id
     */
    public String logout() {
        String result = getAccount().id;
        Job.Scheduler.trigger(Job.OnLoggedOut);
        clear();
        Log.info("logged out : " + result);
        return result;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy