001 package railo.runtime.op; 002 003 import java.util.IdentityHashMap; 004 import java.util.Map; 005 006 import railo.commons.lang.types.RefBoolean; 007 import railo.commons.lang.types.RefBooleanImpl; 008 009 010 public class ThreadLocalDuplication { 011 012 private static ThreadLocal<Map<Object,Object>> local=new ThreadLocal<Map<Object,Object>>(); 013 private static ThreadLocal<RefBoolean> inside=new ThreadLocal<RefBoolean>(); 014 015 public static void set(Object o, Object c) { 016 017 touch().put(o,c); 018 } 019 020 /*public static Map<Object, Object> getMap() { 021 return touch(); 022 } 023 024 public static void removex(Object o) { 025 touch().remove(o); 026 }*/ 027 028 private static Object get(Object obj) { 029 Map<Object,Object> list = touch(); 030 return list.get(obj); 031 } 032 033 034 035 public static Object get(Object object, RefBoolean before) { 036 if(!isInside()){ 037 reset(); 038 setIsInside(true); 039 before.setValue(false); 040 } 041 else 042 before.setValue(true); 043 044 Map<Object,Object> list = touch(); 045 return list.get(object); 046 } 047 048 049 private static Map<Object,Object> touch() { 050 Map<Object,Object> set = local.get(); 051 if(set==null) { 052 set = new IdentityHashMap<Object,Object>();// it is importend to have a reference comparsion here 053 local.set(set); 054 } 055 return set; 056 } 057 public static void reset() { 058 Map<Object,Object> set = local.get(); 059 if(set!=null) set.clear(); 060 setIsInside(false); 061 } 062 063 private static boolean isInside() { 064 RefBoolean b = inside.get(); 065 return b!=null && b.toBooleanValue(); 066 } 067 068 private static void setIsInside(boolean isInside) { 069 RefBoolean b = inside.get(); 070 if(b==null)inside.set(new RefBooleanImpl(isInside)); 071 else b.setValue(isInside); 072 } 073 074 } 075 076