package org.picketlink.authentication.levels.internal;
import org.picketlink.authentication.levels.Level;
import org.picketlink.authentication.levels.SecurityLevelManager;
import org.picketlink.authentication.levels.SecurityLevelResolver;
import org.picketlink.authentication.levels.annotations.DefaultSecurityLevel;
import org.picketlink.producer.LevelFactoryResolver;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.inject.Any;
import javax.enterprise.inject.Instance;
import javax.inject.Inject;
/**
* Resolves security level from all resolvers.
*
* @author Michal Trnka
*/
@ApplicationScoped
public class DefaultSecurityLevelManager implements SecurityLevelManager {
private Level defaultSecurityLevel;
@Inject
@DefaultSecurityLevel
private Instance<Level> levelInstance;
@Inject
@Any
private Instance<SecurityLevelResolver> resolverInstances;
@Inject
private LevelFactoryResolver lfr;
@Inject
public void init() {
if (levelInstance.isUnsatisfied()) {
defaultSecurityLevel = lfr.resolve().createLevel(DEFAULT_SECURITY_LEVEL);
} else {
defaultSecurityLevel = levelInstance.get();
}
}
public Level resolveSecurityLevel() {
//TODO: support async level resolution
Level highestLevel = defaultSecurityLevel;
for (SecurityLevelResolver resolver : resolverInstances) {
Level level = resolver.resolve();
if (highestLevel.compareTo(level) < 0) {
highestLevel = level;
}
}
return highestLevel;
}
}