package org.oneandone.idev.johanna;
import java.util.Objects;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.oneandone.idev.johanna.store.SessionStore;
import org.oneandone.idev.johanna.store.id.IdentifierFactory;
import org.oneandone.idev.johanna.store.memory.MemorySessionStore;
import org.oneandone.idev.johanna.store.redis.RedisSessionStore;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
/**
* List of possible session stores and creation of session stores.
* @author fury
*/
enum SessionStoreFactory {
/** The sessions are kept in memory. */
MEMORY(new CreationDelegate() {
@Override
public SessionStore create(IdentifierFactory identifierFactory, String host) {
log.info("Using \"memory\" backend.");
return new MemorySessionStore(identifierFactory);
}
}),
/** The sessions are kept in a remote REDIS session store.
*/
REDIS(new CreationDelegate() {
@Override
public SessionStore create(IdentifierFactory identifierFactory, String host) {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxActive(JohannahServer.MAX_THREADS);
JedisPool pool = new JedisPool(config, host);
log.log(Level.INFO, "Using \"redis\" backend: {0} @ {1}", new Object[]{pool, host});
return new RedisSessionStore(identifierFactory, pool);
}
});
private final CreationDelegate creationDelegate;
private SessionStoreFactory(CreationDelegate creationDelegate) {
this.creationDelegate = Objects.requireNonNull(creationDelegate);
}
/** Delegates the creation of a {@link SessionStore} to a class. */
private static abstract class CreationDelegate {
protected final Logger log = Logger.getLogger(SessionStoreFactory.class.getName());
public abstract SessionStore create(IdentifierFactory identifierFactory, String host);
}
/** Creates a new session store with the given parameters.
* The session store created corresponds to the current enum type.
* @param identifierFactory the factory for creating session identifiers.
* @param host the remote host the session store runs on (if required, for example for REDIS).
* @see #MEMORY
* @see #REDIS
*/
public SessionStore create(IdentifierFactory identifierFactory, String host) {
return creationDelegate.create(identifierFactory, host);
}
}