package org.hypergraphdb.util; import java.util.HashMap; import java.util.NoSuchElementException; import java.util.Stack; public class VarContext { static ThreadLocal<Stack<VarContext>> stack = new ThreadLocal<Stack<VarContext>>() { @Override protected Stack<VarContext> initialValue() { return new Stack<VarContext>(); } }; // Context manipulation public static VarContext pushFrame() { return stack.get().push(new VarContext()); } public static VarContext pushFrame(VarContext ctx) { return stack.get().push(ctx); } public static VarContext popFrame() { if (stack.get().isEmpty()) throw new NoSuchElementException(); else return stack.get().pop(); } public static VarContext ctx () { if (stack.get().isEmpty()) return new VarContext(); else return stack.get().peek(); } private HashMap<String, Object> vars = new HashMap<String, Object>(); private ThreadLocal<HashMap<String, Object>> locals = new ThreadLocal<HashMap<String, Object>>() { @Override protected HashMap<String, Object> initialValue() { return new HashMap<String, Object>(); }}; private class VarImpl<T> implements Var<T> { String name; public VarImpl(String name) { this.name = name; } @SuppressWarnings("unchecked") public T get() { T result = (T)locals.get().get(name); return result == null ? (T)vars.get(name) : result; } public void set(T value) { locals.get().put(name, value); } } public boolean isSameVar(Var<?> v1, Var<?> v2) { return ((VarImpl<?>)v1).name.equals(((VarImpl<?>)v2).name); } public <T> Var<T> get(final String name) { return new VarImpl<T>(name); } public <T> T getGlobalValue(String name) { return (T)vars.get(name); } public <T> void setGlobalValue(final String name, T value) { vars.put(name, value); } }