package railo.runtime.op; import java.util.IdentityHashMap; import java.util.Map; import railo.commons.lang.types.RefBoolean; import railo.commons.lang.types.RefBooleanImpl; public class ThreadLocalDuplication { private static ThreadLocal<Map<Object,Object>> local=new ThreadLocal<Map<Object,Object>>(); private static ThreadLocal<RefBoolean> inside=new ThreadLocal<RefBoolean>(); public static void set(Object o, Object c) { touch().put(o,c); } /*public static Map<Object, Object> getMap() { return touch(); } public static void removex(Object o) { touch().remove(o); }*/ private static Object get(Object obj) { Map<Object,Object> list = touch(); return list.get(obj); } public static Object get(Object object, RefBoolean before) { if(!isInside()){ reset(); setIsInside(true); before.setValue(false); } else before.setValue(true); Map<Object,Object> list = touch(); return list.get(object); } private static Map<Object,Object> touch() { Map<Object,Object> set = local.get(); if(set==null) { set = new IdentityHashMap<Object,Object>();// it is importend to have a reference comparsion here local.set(set); } return set; } public static void reset() { Map<Object,Object> set = local.get(); if(set!=null) set.clear(); setIsInside(false); } private static boolean isInside() { RefBoolean b = inside.get(); return b!=null && b.toBooleanValue(); } private static void setIsInside(boolean isInside) { RefBoolean b = inside.get(); if(b==null)inside.set(new RefBooleanImpl(isInside)); else b.setValue(isInside); } }