package org.pac4j.vertx.context.session; import org.pac4j.context.session.ExtendedSessionStore; import org.pac4j.core.context.session.SessionStore; import org.pac4j.core.exception.TechnicalException; import org.pac4j.vertx.VertxWebContext; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; /** * Vert.x implementation of pac4j SessionStore interface to access the existing vertx-web session. * */ public class VertxSessionStore implements ExtendedSessionStore<VertxWebContext> { private final io.vertx.ext.web.sstore.SessionStore sessionStore; public VertxSessionStore(io.vertx.ext.web.sstore.SessionStore sessionStore) { this.sessionStore = sessionStore; } @Override public String getOrCreateSessionId(VertxWebContext context) { return context.getVertxSession().id(); } @Override public Object get(VertxWebContext context, String key) { return context.getVertxSession().get(key); } @Override public void set(VertxWebContext context, String key, Object value) { context.getVertxSession().put(key, value); } @Override public boolean destroySession(VertxWebContext context) { context.getVertxSession().destroy(); return true; } @Override public Object getTrackableSession(VertxWebContext context) { return null; } @Override public SessionStore<VertxWebContext> buildFromTrackableSession(VertxWebContext context, Object trackableSession) { return null; } @Override public boolean renewSession(VertxWebContext context) { return false; } @Override public Session getSession(String sessionId) { final CompletableFuture<io.vertx.ext.web.Session> vertxSessionFuture = new CompletableFuture<>(); sessionStore.get(sessionId, asyncResult -> { if (asyncResult.succeeded()) { vertxSessionFuture.complete(asyncResult.result()); } else { vertxSessionFuture.completeExceptionally(asyncResult.cause()); } }); final CompletableFuture<Session> pac4jSessionFuture = vertxSessionFuture.thenApply(s -> new VertxSession(s)); try { return pac4jSessionFuture.get(); } catch (InterruptedException|ExecutionException e) { throw new TechnicalException(e); } } }