package org.pac4j.play.deadbolt2;
import be.objectify.deadbolt.java.ConfigKeys;
import be.objectify.deadbolt.java.DeadboltHandler;
import be.objectify.deadbolt.java.cache.HandlerCache;
import org.pac4j.core.config.Config;
import org.pac4j.core.util.CommonHelper;
import org.pac4j.play.store.PlaySessionStore;
import play.libs.concurrent.HttpExecutionContext;
import javax.inject.Inject;
import javax.inject.Singleton;
import java.util.HashMap;
import java.util.Map;
/**
* This is a simple handler cache to store {@link Pac4jHandler}. The deadbolt key is the pac4j clients parameter,
* the default key being a <code>null</code> clients parameter.
*
* @author Jerome Leleu
* @since 2.6.0
*/
@Singleton
public class Pac4jHandlerCache implements HandlerCache {
private final Map<String, DeadboltHandler> handlers = new HashMap<>();
private Config config;
private HttpExecutionContext httpExecutionContext;
private PlaySessionStore playSessionStore;
private DeadboltHandler defaultHandler;
private final Pac4jRoleHandler roleHandler;
@Inject
public Pac4jHandlerCache(final Config config, final HttpExecutionContext httpExecutionContext, final PlaySessionStore playSessionStore, Pac4jRoleHandler roleHandler) {
this.config = config;
this.httpExecutionContext = httpExecutionContext;
this.playSessionStore = playSessionStore;
this.roleHandler = roleHandler;
defaultHandler = new Pac4jHandler(config, httpExecutionContext, null, playSessionStore, roleHandler);
handlers.put(ConfigKeys.DEFAULT_HANDLER_KEY, defaultHandler);
}
@Override
public DeadboltHandler apply(final String clients) {
DeadboltHandler handler = handlers.get(clients);
if (handler == null) {
handler = getAndBuildHandler(clients);
}
return handler;
}
protected synchronized DeadboltHandler getAndBuildHandler(final String clients) {
DeadboltHandler handler = handlers.get(clients);
if (handler == null) {
handler = new Pac4jHandler(config, httpExecutionContext, clients, playSessionStore, roleHandler);
}
return handler;
}
@Override
public DeadboltHandler get() {
return defaultHandler;
}
@Override
public String toString() {
return CommonHelper.toString(this.getClass(), "handlers", handlers, "config", config,
"httpExecutionContext", httpExecutionContext, "playSessionStore", playSessionStore);
}
}