1 package org.simantics.scl.runtime;
\r
3 import gnu.trove.map.hash.THashMap;
\r
5 public class SCLContext extends THashMap<String,Object> {
\r
6 private static ThreadLocal<SCLContext> CONTEXT = new ThreadLocal<SCLContext>();
\r
7 private static ThreadLocal<OldContextNode> OLD_CONTEXT = new ThreadLocal<OldContextNode>();
\r
9 private static class OldContextNode {
\r
10 final SCLContext context;
\r
11 final OldContextNode next;
\r
13 public OldContextNode(SCLContext context, OldContextNode next) {
\r
14 this.context = context;
\r
19 public static SCLContext getCurrent() {
\r
20 SCLContext context = CONTEXT.get();
\r
21 if(context == null) {
\r
22 context = new SCLContext();
\r
23 CONTEXT.set(context);
\r
28 public static void push(SCLContext newContext) {
\r
29 SCLContext oldContext = CONTEXT.get();
\r
30 if(oldContext != null)
\r
31 OLD_CONTEXT.set(new OldContextNode(oldContext, OLD_CONTEXT.get()));
\r
32 CONTEXT.set(newContext);
\r
35 public static void pop() {
\r
36 OldContextNode node = OLD_CONTEXT.get();
\r
40 CONTEXT.set(node.context);
\r
41 OLD_CONTEXT.set(node.next);
\r
47 public Object get(Object key) {
\r
48 Object result = super.get(key);
\r
49 System.out.println(this + ": " + key + " -> " + result);
\r
54 public Object put(String key, Object value) {
\r
55 System.out.println(this + ": " + key + " <- " + value);
\r
56 return super.put(key, value);
\r