summaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorBen Culkin <scorpress@gmail.com>2020-11-22 15:15:11 -0500
committerBen Culkin <scorpress@gmail.com>2020-11-22 15:15:11 -0500
commitc85db1bef75e5c9b7287ab7fdb6e1380d577c674 (patch)
tree081805e198cbab9025789ca4c142003279a5a201 /src/main/java
parent86ad50b4df6166c6f99b08d91d49fe59ee754619 (diff)
Add a 'context' type
This was some example code I found somewhere that seemed interesting.
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/bjc/data/Contexts.java82
-rw-r--r--src/main/java/bjc/data/IContext.java18
2 files changed, 100 insertions, 0 deletions
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> T get(Class<T> contract) {
+ throw new NoSuchElementException();
+ }
+ }
+
+ private static class ContextImpl implements IContext {
+
+ private final IContext parent;
+
+ private final Map<String, Object> objects;
+
+ public ContextImpl(IContext parent) {
+ this.parent = parent;
+ this.objects = new HashMap<String, Object>();
+ }
+
+ @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> T get(Class<T> contract) {
+ for (Object o : objects.values()) {
+ if (contract.isInstance(o)) {
+ return (T) o;
+ }
+ }
+ return parent.get(contract);
+ }
+
+ @Override
+ public IContext getParent() {
+ return parent;
+ }
+ }
+}
diff --git a/src/main/java/bjc/data/IContext.java b/src/main/java/bjc/data/IContext.java
new file mode 100644
index 0000000..a1073f1
--- /dev/null
+++ b/src/main/java/bjc/data/IContext.java
@@ -0,0 +1,18 @@
+package bjc.data;
+
+public interface IContext {
+ void register(String name, Object o);
+
+ IContext getParent();
+
+ Object get(String name);
+
+ <T> T get(Class<T> contract);
+
+ default <T> T get(String name, Class<T> contract) {
+ Object obj = get(name);
+ return obj == null
+ ? getParent().get(name, contract)
+ : contract.cast(obj);
+ };
+}