+package org.simantics.scl.runtime;\r
+\r
+import gnu.trove.map.hash.THashMap;\r
+\r
+import java.util.Map;\r
+\r
+public class SCLContext extends THashMap<String,Object> {\r
+ private static ThreadLocal<SCLContext> CONTEXT = new ThreadLocal<SCLContext>();\r
+ private static ThreadLocal<OldContextNode> OLD_CONTEXT = new ThreadLocal<OldContextNode>();\r
+ \r
+ private static class OldContextNode {\r
+ final SCLContext context;\r
+ final OldContextNode next;\r
+ \r
+ public OldContextNode(SCLContext context, OldContextNode next) {\r
+ this.context = context;\r
+ this.next = next;\r
+ }\r
+ }\r
+ \r
+ public static SCLContext getCurrent() {\r
+ SCLContext context = CONTEXT.get();\r
+ if(context == null) {\r
+ context = new SCLContext();\r
+ CONTEXT.set(context);\r
+ }\r
+ return context;\r
+ }\r
+ \r
+ public static void push(SCLContext newContext) {\r
+ SCLContext oldContext = CONTEXT.get();\r
+ if(oldContext != null)\r
+ OLD_CONTEXT.set(new OldContextNode(oldContext, OLD_CONTEXT.get()));\r
+ CONTEXT.set(newContext);\r
+ }\r
+ \r
+ public static void pop() {\r
+ OldContextNode node = OLD_CONTEXT.get();\r
+ if(node == null)\r
+ CONTEXT.set(null);\r
+ else {\r
+ CONTEXT.set(node.context);\r
+ OLD_CONTEXT.set(node.next);\r
+ }\r
+ }\r
+ \r
+ /*\r
+ @Override\r
+ public Object get(Object key) {\r
+ Object result = super.get(key);\r
+ System.out.println(this + ": " + key + " -> " + result);\r
+ return result;\r
+ }\r
+ \r
+ @Override\r
+ public Object put(String key, Object value) {\r
+ System.out.println(this + ": " + key + " <- " + value);\r
+ return super.put(key, value);\r
+ }*/\r
+}\r