package com.vtence.molecule.lib; import com.vtence.molecule.Request; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; public class FlashHash { private final Map<String, Object> entries = new HashMap<>(); private final Set<String> keep = new HashSet<>(); public FlashHash() { this(Collections.emptyMap()); } public FlashHash(Map<String, ?> flashes) { this.entries.putAll(flashes); } public static FlashHash get(Request request) { return request.attribute(FlashHash.class); } public void bind(Request request) { request.attribute(FlashHash.class, this); } public static void unbind(Request request) { request.removeAttribute(FlashHash.class); } @SuppressWarnings("unchecked") public <T> T get(Object key) { return (T) entries.get(String.valueOf(key)); } @SuppressWarnings("unchecked") public <T> T put(Object key, Object value) { keep.add(String.valueOf(key)); return (T) entries.put(String.valueOf(key), value); } @SuppressWarnings("unchecked") public <T> T remove(Object key) { return (T) entries.remove(String.valueOf(key)); } public boolean has(Object key) { return entries.containsKey(String.valueOf(key)); } public boolean empty() { return entries.isEmpty(); } public Set<String> keys() { return entries.keySet(); } public void notice(String message) { put("notice", message); } public String notice() { return get("notice"); } public void alert(String message) { put("alert", message); } public String alert() { return get("alert"); } public void clear() { entries.clear(); } public void putAll(Map<?, ?> values) { for (Object key : values.keySet()) { put(key, values.get(key)); } } public void sweep() { Map<String, Object> fresh = new HashMap<>(); entries.keySet().stream().filter(this.keep::contains).forEach(key -> fresh.put(key, entries.get(key))); entries.clear(); entries.putAll(fresh); } public Map<String, Object> toMap() { return new HashMap<>(entries); } }