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

com.redhat.lightblue.rest.auth.CachedRolesProvider Maven / Gradle / Ivy

There is a newer version: 2.32.0
Show newest version
package com.redhat.lightblue.rest.auth;

import java.util.Set;

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

import com.redhat.lightblue.rest.auth.health.RolesProviderHealth;

/**
 * Caches results from {@link RolesProvider} and supports fallback to cache.
 * See {@link RolesCache} for more details.
 *
 * @author mpatercz
 *
 */
public class CachedRolesProvider implements RolesProvider {

    private final Logger LOGGER = LoggerFactory.getLogger(CachedRolesProvider.class);

    private RolesProvider rolesProvider;
    private RolesCache rolesCache;

    public CachedRolesProvider(RolesProvider rolesProvider) {
        super();
        this.rolesProvider = rolesProvider;
        this.rolesCache = new RolesCache(5*60*1000);
    }

    public CachedRolesProvider(RolesProvider rolesProvider, RolesCache rolesCache) {
        super();
        this.rolesProvider = rolesProvider;
        this.rolesCache = rolesCache;
    }

    @Override
    public Set getUserRoles(String username) throws Exception {

        try {
            Set roles = rolesCache.get(username);

            if (roles != null) {
                LOGGER.debug("Found roles in cache for uid={}", username);
                return roles;
            }


            LOGGER.debug("Cache missed for uid={}. Calling ldap.", username);

            roles = rolesProvider.getUserRoles(username);
            rolesCache.put(username, roles);

            return roles;
        } catch (Exception e) {
            Set roles = rolesCache.getFromFallback(username);

            if (roles != null) {
                LOGGER.error("There was an error getting roles for "+username+", taking roles from fallback cache.", e);
                return roles;
            }

            // no fallback, nothing we can do
            throw e;
        }
    }

    protected Set getFallback(String username) {
        Set roles = rolesCache.getFromFallback(username);
        if (roles == null) {
            return null;
        }
        // was able to use the cache or use the LDAP server on the second retry
        LOGGER.debug("User "+username+" found in failoverCache");
        return roles;
    }

    @Override
    public RolesProviderHealth checkHealth() {
        return rolesProvider.checkHealth();
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy