]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.runtime/src/org/simantics/scl/runtime/SCLContext.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.scl.runtime / src / org / simantics / scl / runtime / SCLContext.java
diff --git a/bundles/org.simantics.scl.runtime/src/org/simantics/scl/runtime/SCLContext.java b/bundles/org.simantics.scl.runtime/src/org/simantics/scl/runtime/SCLContext.java
new file mode 100644 (file)
index 0000000..63fa2f1
--- /dev/null
@@ -0,0 +1,60 @@
+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