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