1 package org.simantics.scl.runtime;
\r
3 import gnu.trove.map.hash.THashMap;
\r
5 import java.util.Map;
\r
7 public class SCLContext extends THashMap<String,Object> {
\r
8 private static ThreadLocal<SCLContext> CONTEXT = new ThreadLocal<SCLContext>();
\r
9 private static ThreadLocal<OldContextNode> OLD_CONTEXT = new ThreadLocal<OldContextNode>();
\r
11 private static class OldContextNode {
\r
12 final SCLContext context;
\r
13 final OldContextNode next;
\r
15 public OldContextNode(SCLContext context, OldContextNode next) {
\r
16 this.context = context;
\r
21 public static SCLContext getCurrent() {
\r
22 SCLContext context = CONTEXT.get();
\r
23 if(context == null) {
\r
24 context = new SCLContext();
\r
25 CONTEXT.set(context);
\r
30 public static void push(SCLContext newContext) {
\r
31 SCLContext oldContext = CONTEXT.get();
\r
32 if(oldContext != null)
\r
33 OLD_CONTEXT.set(new OldContextNode(oldContext, OLD_CONTEXT.get()));
\r
34 CONTEXT.set(newContext);
\r
37 public static void pop() {
\r
38 OldContextNode node = OLD_CONTEXT.get();
\r
42 CONTEXT.set(node.context);
\r
43 OLD_CONTEXT.set(node.next);
\r
49 public Object get(Object key) {
\r
50 Object result = super.get(key);
\r
51 System.out.println(this + ": " + key + " -> " + result);
\r
56 public Object put(String key, Object value) {
\r
57 System.out.println(this + ": " + key + " <- " + value);
\r
58 return super.put(key, value);
\r