package cn.org.rapid_framework.web.scope;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* 实现Flash Scope,存储在Flash中的数据可以在下一次http请求时获得.
*
* @author Play Framework
* @author badqiu
*
*/
public class Flash {
private static final String FLASH_IN_SESSION_KEY = "__flash__";
private Map<String, String> data = new HashMap<String, String>();
private Map<String, String> out = new HashMap<String, String>();
@SuppressWarnings("unchecked")
public static Flash restore(HttpServletRequest request) {
Flash flash = new Flash();
HttpSession session = request.getSession();
Map<String, String> flashData = (Map<String, String>)session.getAttribute(FLASH_IN_SESSION_KEY);
if(flashData != null) {
flash.data = flashData;
}
return flash;
}
public void save(HttpServletRequest request,HttpServletResponse response) {
HttpSession session = request.getSession();
if(session != null) {
session.setAttribute(FLASH_IN_SESSION_KEY, out);
}
}
// ThreadLocal access
private static ThreadLocal<Flash> current = new ThreadLocal<Flash>();
public static Flash current() {
return current.get();
}
static void setCurrent(Flash f) {
current.set(f);
}
public void put(String key, String value) {
if (key.contains(":")) {
throw new IllegalArgumentException("Character ':' is invalid in a flash key.");
}
data.put(key, value);
out.put(key, value);
}
public void now(String key, String value) {
if (key.contains(":")) {
throw new IllegalArgumentException("Character ':' is invalid in a flash key.");
}
data.put(key, value);
}
public void put(String key, Object value) {
if (value == null) {
put(key, (String) null);
}
put(key, value + "");
}
public void error(String value, Object... args) {
put("error", String.format(value, args));
}
public void success(String value, Object... args) {
put("success", String.format(value, args));
}
public void discard(String key) {
out.remove(key);
}
public void discard() {
out.clear();
}
public void keep(String key) {
if (data.containsKey(key)) {
out.put(key, data.get(key));
}
}
public void keep() {
out.putAll(data);
}
public String get(String key) {
return data.get(key);
}
public boolean remove(String key) {
return data.remove(key) != null;
}
public void clear() {
data.clear();
}
public boolean contains(String key) {
return data.containsKey(key);
}
public String toString() {
return data.toString();
}
public Map<String, String> getData() {
return data;
}
}