1 32 package net.sf.retrotranslator.runtime.java.lang; 33 34 import net.sf.retrotranslator.runtime.impl.Advanced; 35 import java.util.*; 36 37 40 @Advanced 41 public class InheritableThreadLocal_ extends ThreadLocal_ { 42 43 private class Key { 44 public InheritableThreadLocal_ get() { 45 return InheritableThreadLocal_.this; 46 } 47 } 48 49 private static class Container extends InheritableThreadLocal <Map<Key, Object >> { 50 51 protected Map<Key, Object > initialValue() { 52 return new WeakHashMap<Key, Object >(); 53 } 54 55 protected Map<Key, Object > childValue(Map<Key, Object > parentValue) { 56 WeakHashMap<Key, Object > result = new WeakHashMap<Key, Object >(parentValue.size() * 2); 57 for (Map.Entry<Key, Object > entry : parentValue.entrySet()) { 58 Key key = entry.getKey(); 59 result.put(key, key.get().childValue(entry.getValue())); 60 } 61 return result; 62 } 63 } 64 65 private static final Container container = new Container(); 66 67 private final Key key = new Key(); 68 69 public InheritableThreadLocal_() { 70 } 71 72 public Object get() { 73 Map<Key, Object > map = container.get(); 74 Object value = map.get(key); 75 if (value == null && !map.containsKey(key)) { 76 map.put(key, value = initialValue()); 77 } 78 return value; 79 } 80 81 public void set(Object value) { 82 container.get().put(key, value); 83 } 84 85 public void remove() { 86 container.get().remove(key); 87 } 88 89 protected Object childValue(Object parentValue) { 90 return parentValue; 91 } 92 93 } 94 | Popular Tags |