From c85db1bef75e5c9b7287ab7fdb6e1380d577c674 Mon Sep 17 00:00:00 2001 From: Ben Culkin Date: Sun, 22 Nov 2020 15:15:11 -0500 Subject: Add a 'context' type This was some example code I found somewhere that seemed interesting. --- src/main/java/bjc/data/Contexts.java | 82 ++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 src/main/java/bjc/data/Contexts.java (limited to 'src/main/java/bjc/data/Contexts.java') diff --git a/src/main/java/bjc/data/Contexts.java b/src/main/java/bjc/data/Contexts.java new file mode 100644 index 0000000..0769447 --- /dev/null +++ b/src/main/java/bjc/data/Contexts.java @@ -0,0 +1,82 @@ +package bjc.data; + +import java.util.*; + +public class Contexts { + public static final IContext NULL = new NullContextImpl(); + + private Contexts() { + throw new UnsupportedOperationException(); + } + + public static IContext create() { + return new ContextImpl(NULL); + } + + public static IContext create(IContext parent) { + return new ContextImpl(parent); + } + + private static class NullContextImpl implements IContext { + @Override + public IContext getParent() { + return this; + } + + @Override + public void register(String name, Object o) { + throw new UnsupportedOperationException(); + } + + @Override + public Object get(String name) { + throw new NoSuchElementException(); + } + + @Override + public T get(Class contract) { + throw new NoSuchElementException(); + } + } + + private static class ContextImpl implements IContext { + + private final IContext parent; + + private final Map objects; + + public ContextImpl(IContext parent) { + this.parent = parent; + this.objects = new HashMap(); + } + + @Override + public void register(String name, Object o) { + objects.put(name, o); + } + + @Override + public Object get(String name) { + if (objects.containsKey(name)) { + return objects.get(name); + } + return parent.get(name); + } + + @SuppressWarnings("unchecked") + @Override + public T get(Class contract) { + for (Object o : objects.values()) { + if (contract.isInstance(o)) { + return (T) o; + } + } + return parent.get(contract); + } + + @Override + public IContext getParent() { + return parent; + } + } +} -- cgit v1.2.3