summaryrefslogtreecommitdiff
path: root/BJC-Utils2/src/main
diff options
context:
space:
mode:
authorEVE <EVE@EVE-PC>2017-03-14 12:06:43 -0400
committerEVE <EVE@EVE-PC>2017-03-14 12:06:43 -0400
commit5c1163df17c46f7d3e15b6c7949c38843ec56146 (patch)
treea2db3f0519181e5b6a1486d3129de8398babcd95 /BJC-Utils2/src/main
parent27bf571d6413c3cc6a5d664b5bddd38d21d7b1cd (diff)
Directory work
Diffstat (limited to 'BJC-Utils2/src/main')
-rw-r--r--BJC-Utils2/src/main/java/bjc/utils/esodata/Directory.java225
-rw-r--r--BJC-Utils2/src/main/java/bjc/utils/esodata/SimpleDirectory.java58
-rw-r--r--BJC-Utils2/src/main/java/bjc/utils/esodata/UnifiedDirectory.java68
3 files changed, 234 insertions, 117 deletions
diff --git a/BJC-Utils2/src/main/java/bjc/utils/esodata/Directory.java b/BJC-Utils2/src/main/java/bjc/utils/esodata/Directory.java
index 3d02c9c..6fdfe16 100644
--- a/BJC-Utils2/src/main/java/bjc/utils/esodata/Directory.java
+++ b/BJC-Utils2/src/main/java/bjc/utils/esodata/Directory.java
@@ -1,117 +1,108 @@
-package bjc.utils.esodata;
-
-import bjc.utils.funcdata.FunctionalMap;
-import bjc.utils.funcdata.IMap;
-
-/**
- * Represents a hierarchical map.
- *
- * What's useful about this is that you can hand sub-directories to people and
- * be able to ensure that they can't write outside of it.
- *
- * @param K
- * The key type of the map.
- * @param V
- * The value type of the map.
- */
-public class Directory<K, V> {
- private IMap<K, Directory<K, V>> children;
-
- private IMap<K, V> data;
-
- /**
- * Create a new directory.
- */
- public Directory() {
- children = new FunctionalMap<>();
- data = new FunctionalMap<>();
- }
-
- /**
- * Create a new sub-directory.
- *
- * Will fail if a sub-directory of that name already exists.
- *
- * @param key
- * The name of the new sub-directory.
- *
- * @return The new sub-directory, or null if one by that name already
- * exists.
- */
- public Directory<K, V> newSubdirectory(K key) {
- if (children.containsKey(key))
- return null;
-
- Directory<K, V> kid = new Directory<>();
- children.put(key, kid);
- return kid;
- }
-
- /**
- * Check if a given sub-directory exists.
- *
- * @param key
- * The key to look for the sub-directory under.
- *
- * @return Whether or not a sub-directory of that name exists.
- */
- public boolean hasSubdirectory(K key) {
- return children.containsKey(key);
- }
-
- /**
- * Retrieves a given sub-directory.
- *
- * @param key
- * The key to retrieve the sub-directory for.
- *
- * @return The sub-directory under that name.
- *
- * @throws IllegalArgumentException
- * If the given sub-directory doesn't exist.
- */
- public Directory<K, V> getSubdirectory(K key) {
- return children.get(key);
- }
-
- /**
- * Insert a data-item into the directory.
- *
- * @param key
- * The key to insert into.
- * @param val
- * The value to insert.
- *
- * @return The old value of key, or null if such a value didn't exist.
- */
- public V put(K key, V val) {
- return data.put(key, val);
- }
-
- /**
- * Check if the directory contains a data-item under the given key.
- *
- * @param key
- * The key to check for.
- *
- * @return Whether or not there is a data item for the given key.
- */
- public boolean containsKey(K key) {
- return data.containsKey(key);
- }
-
- /**
- * Retrive a given data-item from the directory.
- *
- * @param key
- * The key to retrieve data for.
- *
- * @return The value for the given key.
- *
- * @throws IllegalArgumentException
- * If no value exists for the given key.
- */
- public V get(K key) {
- return data.get(key);
- }
-}
+package bjc.utils.esodata;
+
+/**
+ * Represents a hierarchical map.
+ *
+ * What's useful about this is that you can hand sub-directories to people and
+ * be able to ensure that they can't write outside of it.
+ *
+ * @param K
+ * The key type of the map.
+ * @param V
+ * The value type of the map.
+ */
+public interface Directory<K, V> {
+ /**
+ * Retrieves a given sub-directory.
+ *
+ * @param key
+ * The key to retrieve the sub-directory for.
+ *
+ * @return The sub-directory under that name.
+ *
+ * @throws IllegalArgumentException
+ * If the given sub-directory doesn't exist.
+ */
+ Directory<K, V> getSubdirectory(K key);
+
+ /**
+ * Check if a given sub-directory exists.
+ *
+ * @param key
+ * The key to look for the sub-directory under.
+ *
+ * @return Whether or not a sub-directory of that name exists.
+ */
+ boolean hasSubdirectory(K key);
+
+ /**
+ * Insert a sub-directory into the dictionary.
+ *
+ * @param key
+ * The name of the new sub-directory
+ * @param value
+ * The sub-directory to insert
+ *
+ * @return The old sub-directory attached to this key, or null if such a
+ * sub-directory didn't exist
+ */
+ Directory<K, V> putSubdirectory(K key, Directory<K, V> value);
+
+ /**
+ * Create a new sub-directory.
+ *
+ * Will fail if a sub-directory of that name already exists.
+ *
+ * @param key
+ * The name of the new sub-directory.
+ *
+ * @return The new sub-directory, or null if one by that name already
+ * exists.
+ */
+ default Directory<K, V> newSubdirectory(K key) {
+ if(hasSubdirectory(key)) {
+ return null;
+ }
+
+ Directory<K, V> dir = new SimpleDirectory<>();
+
+ putSubdirectory(key, dir);
+
+ return dir;
+ }
+
+ /**
+ * Check if the directory contains a data-item under the given key.
+ *
+ * @param key
+ * The key to check for.
+ *
+ * @return Whether or not there is a data item for the given key.
+ */
+ boolean containsKey(K key);
+
+ /**
+ * Retrieve a given data-item from the directory.
+ *
+ * @param key
+ * The key to retrieve data for.
+ *
+ * @return The value for the given key.
+ *
+ * @throws IllegalArgumentException
+ * If no value exists for the given key.
+ */
+ V getKey(K key);
+
+ /**
+ * Insert a data-item into the directory.
+ *
+ * @param key
+ * The key to insert into.
+ * @param val
+ * The value to insert.
+ *
+ * @return The old value of key, or null if such a value didn't exist.
+ */
+ V putKey(K key, V val);
+} \ No newline at end of file
diff --git a/BJC-Utils2/src/main/java/bjc/utils/esodata/SimpleDirectory.java b/BJC-Utils2/src/main/java/bjc/utils/esodata/SimpleDirectory.java
new file mode 100644
index 0000000..22a7e56
--- /dev/null
+++ b/BJC-Utils2/src/main/java/bjc/utils/esodata/SimpleDirectory.java
@@ -0,0 +1,58 @@
+package bjc.utils.esodata;
+
+import bjc.utils.funcdata.FunctionalMap;
+import bjc.utils.funcdata.IMap;
+
+/**
+ * Simple implementation of {@link Directory}.
+ *
+ * Has a split namespace for data and children.
+ *
+ * @author EVE
+ *
+ * @param <K> The key type of the directory.
+ * @param <V> The value type of the directory.
+ */
+public class SimpleDirectory<K, V> implements Directory<K, V> {
+ private IMap<K, Directory<K, V>> children;
+
+ private IMap<K, V> data;
+
+ /**
+ * Create a new directory.
+ */
+ public SimpleDirectory() {
+ children = new FunctionalMap<>();
+ data = new FunctionalMap<>();
+ }
+
+ @Override
+ public Directory<K, V> getSubdirectory(K key) {
+ return children.get(key);
+ }
+
+ @Override
+ public boolean hasSubdirectory(K key) {
+ return children.containsKey(key);
+ }
+
+ @Override
+ public Directory<K, V> putSubdirectory(K key, Directory<K, V> val) {
+ return children.put(key, val);
+ }
+
+ @Override
+ public boolean containsKey(K key) {
+ return data.containsKey(key);
+ }
+
+ @Override
+ public V getKey(K key) {
+ return data.get(key);
+ }
+
+ @Override
+ public V putKey(K key, V val) {
+ return data.put(key, val);
+ }
+} \ No newline at end of file
diff --git a/BJC-Utils2/src/main/java/bjc/utils/esodata/UnifiedDirectory.java b/BJC-Utils2/src/main/java/bjc/utils/esodata/UnifiedDirectory.java
new file mode 100644
index 0000000..187474c
--- /dev/null
+++ b/BJC-Utils2/src/main/java/bjc/utils/esodata/UnifiedDirectory.java
@@ -0,0 +1,68 @@
+package bjc.utils.esodata;
+
+import bjc.utils.funcdata.FunctionalMap;
+import bjc.utils.funcdata.IMap;
+
+/**
+ * Simple implementation of {@link Directory}.
+ *
+ * Has a unified namespace for data and children.
+ *
+ * @author EVE
+ *
+ * @param <K>
+ * The key type of the directory.
+ * @param <V>
+ * The value type of the directory.
+ */
+public class UnifiedDirectory<K, V> implements Directory<K, V> {
+ private IMap<K, Directory<K, V>> children;
+
+ private IMap<K, V> data;
+
+ /**
+ * Create a new directory.
+ */
+ public UnifiedDirectory() {
+ children = new FunctionalMap<>();
+ data = new FunctionalMap<>();
+ }
+
+ @Override
+ public Directory<K, V> getSubdirectory(K key) {
+ return children.get(key);
+ }
+
+ @Override
+ public boolean hasSubdirectory(K key) {
+ return children.containsKey(key);
+ }
+
+ @Override
+ public Directory<K, V> putSubdirectory(K key, Directory<K, V> val) {
+ if(data.containsKey(key)) {
+ throw new IllegalArgumentException("Key " + key + " is already used for data.");
+ }
+
+ return children.put(key, val);
+ }
+
+ @Override
+ public boolean containsKey(K key) {
+ return data.containsKey(key);
+ }
+
+ @Override
+ public V getKey(K key) {
+ return data.get(key);
+ }
+
+ @Override
+ public V putKey(K key, V val) {
+ if(children.containsKey(key)) {
+ throw new IllegalArgumentException("Key " + key + " is already used for sub-directories.");
+ }
+
+ return data.put(key, val);
+ }
+} \ No newline at end of file