package com.dianping.pigeon.remoting.common.util; import java.io.Serializable; import java.util.HashMap; import java.util.Map; public class ContextUtils { private static ThreadLocal<Map> localContext = new ThreadLocal<Map>(); private static ThreadLocal<Map<String, Serializable>> globalContext = new ThreadLocal<Map<String, Serializable>>(); private static ThreadLocal<Map<String, Serializable>> requestContext = new ThreadLocal<Map<String, Serializable>>(); private static ThreadLocal<Map<String, Serializable>> responseContext = new ThreadLocal<Map<String, Serializable>>(); public static void putLocalContext(Object key, Object value) { Map<Object, Object> context = localContext.get(); if (context == null) { context = new HashMap<Object, Object>(); localContext.set(context); } context.put(key, value); } public static Map getLocalContext() { return localContext.get(); } public static Object getLocalContext(Object key) { Map context = localContext.get(); if (context == null) { return null; } return context.get(key); } public static void clearLocalContext() { Map context = localContext.get(); if (context != null) { context.clear(); } localContext.remove(); } public static void putGlobalContext(String key, Serializable value) { Map<String, Serializable> context = globalContext.get(); if (context == null) { context = new HashMap<String, Serializable>(); globalContext.set(context); } context.put(key, value); } public static void setGlobalContext(Map<String, Serializable> context) { globalContext.set(context); } public static Map<String, Serializable> getGlobalContext() { return globalContext.get(); } public static Serializable getGlobalContext(String key) { Map<String, Serializable> context = globalContext.get(); if (context == null) { return null; } return context.get(key); } public static void clearGlobalContext() { Map<String, Serializable> context = globalContext.get(); if (context != null) { context.clear(); } globalContext.remove(); } public static void initRequestContext() { Map<String, Serializable> context = requestContext.get(); if (context == null) { context = new HashMap<String, Serializable>(); requestContext.set(context); } } public static void putRequestContext(String key, Serializable value) { Map<String, Serializable> context = requestContext.get(); if (context == null) { context = new HashMap<String, Serializable>(); requestContext.set(context); } context.put(key, value); } public static Map<String, Serializable> getRequestContext() { return requestContext.get(); } public static Serializable getRequestContext(String key) { Map<String, Serializable> context = requestContext.get(); if (context == null) { return null; } return context.get(key); } public static void clearRequestContext() { Map<String, Serializable> context = requestContext.get(); if (context != null) { context.clear(); } requestContext.remove(); } public static void putResponseContext(String key, Serializable value) { Map<String, Serializable> context = responseContext.get(); if (context == null) { context = new HashMap<String, Serializable>(); responseContext.set(context); } context.put(key, value); } public static Map<String, Serializable> getResponseContext() { return responseContext.get(); } public static Serializable getResponseContext(String key) { Map<String, Serializable> context = responseContext.get(); if (context == null) { return null; } return context.get(key); } public static void setResponseContext(Map<String, Serializable> context) { responseContext.set(context); } public static void clearResponseContext() { Map<String, Serializable> context = responseContext.get(); if (context != null) { context.clear(); } responseContext.remove(); } public static Long getRemainedTimeMillis() { Integer timeout = (Integer) getLocalContext(Constants.CONTEXT_KEY_TIMEOUT_MILLIS); Integer createTime = (Integer) getLocalContext(Constants.CONTEXT_KEY_CREATE_TIME_MILLIS); if (createTime == null || timeout == null) { return null; } else { return timeout - (System.currentTimeMillis() - createTime); } } public static void convertContext(Map<String, Serializable> srcCtx, Map<String, String> dstCtx) { if (srcCtx != null) { for (Map.Entry<String, Serializable> entry : srcCtx.entrySet()) { if (entry.getValue() != null) { if (entry.getValue() instanceof String) { dstCtx.put(entry.getKey(), (String) entry.getValue()); } else { throw new IllegalArgumentException("only support string type."); } } } } } public static Map<String, Serializable> convertContext(Map<String, String> srcCtx) { Map<String, Serializable> dstCtx = new HashMap<String, Serializable>(); if (srcCtx != null) { for (Map.Entry<String, String> entry : srcCtx.entrySet()) { dstCtx.put(entry.getKey(), entry.getValue()); } } return dstCtx; } }