package ddth.dasp.common; import java.util.HashMap; import java.util.Map; import ddth.dasp.common.id.IdGenerator; /** * Mimic the concept of {@link ThreadLocal}, but for a "request". * * @author NBThanh <btnguyen2k@gmail.com> */ public class RequestLocal { private static ThreadLocal<RequestLocal> threadRequestlocal = new ThreadLocal<RequestLocal>(); /** * Gets {@link RequestLocal} instance from the thread local if any. * * @return */ public static RequestLocal get() { return threadRequestlocal.get(); } /** * Puts a {@link RequestLocal} instance to the thread local. * * @param requestLocal */ public static void set(RequestLocal requestLocal) { threadRequestlocal.set(requestLocal); } /** * Removes the {@link RequestLocal} instance from the thread local. */ public static void remove() { threadRequestlocal.remove(); } private String id = IdGenerator.getInstance(IdGenerator.getMacAddr()) .generateId64Hex(); private Map<String, Object> localVariables = new HashMap<String, Object>(); public void init() { // EMPTY } public void destroy() { localVariables.clear(); } @Override protected void finalize() { localVariables.clear(); } public String getId() { return id; } /** * Gets a request local variable. * * @param name * @return */ public Object getLocalVariable(String name) { return localVariables.get(name); } /** * Gets a request local variable. * * @param name * @return */ @SuppressWarnings("unchecked") public <T> T getLocalVariable(String name, Class<T> clazz) { Object result = getLocalVariable(name); if (result != null && clazz.isAssignableFrom(result.getClass())) { return (T) result; } return null; } /** * Sets a local variable. * * @param name * @param value */ public void setLocalVariable(String name, Object value) { localVariables.put(name, value); } }