package com.vtence.molecule.middlewares; import com.vtence.molecule.Request; import com.vtence.molecule.Response; import com.vtence.molecule.lib.FlashHash; import com.vtence.molecule.session.Session; import java.util.HashMap; import java.util.Map; import java.util.function.BiConsumer; import java.util.function.Consumer; public class Flash extends AbstractMiddleware { public void handle(Request request, Response response) throws Exception { FlashHash flash = loadFlash(request); flash.bind(request); try { forward(request, response).whenSuccessful(commitFlash(request)).whenComplete(unbindFlashFrom(request)); } catch (Throwable error) { FlashHash.unbind(request); throw error; } } private BiConsumer<Response, Throwable> unbindFlashFrom(final Request request) { return (response, throwable) -> FlashHash.unbind(request); } private FlashHash loadFlash(Request request) { Session session = fetchSession(request); Map<String, Object> flashes = session.contains(FlashHash.class) ? session.remove(FlashHash.class) : new HashMap<>(); return new FlashHash(flashes); } private Consumer<Response> commitFlash(Request request) { return response -> { Session session = fetchSession(request); FlashHash flash = FlashHash.get(request); flash.sweep(); if (!session.invalid() && !flash.empty()) { session.put(FlashHash.class, flash.toMap()); } }; } private Session fetchSession(Request request) { Session session = Session.get(request); if (session == null) throw new IllegalStateException("No session bound to request"); return session; } }