aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/io/trygvis/esper/testing/object/ObjectManager.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/io/trygvis/esper/testing/object/ObjectManager.java')
-rw-r--r--src/main/java/io/trygvis/esper/testing/object/ObjectManager.java60
1 files changed, 60 insertions, 0 deletions
diff --git a/src/main/java/io/trygvis/esper/testing/object/ObjectManager.java b/src/main/java/io/trygvis/esper/testing/object/ObjectManager.java
new file mode 100644
index 0000000..cd0dd1e
--- /dev/null
+++ b/src/main/java/io/trygvis/esper/testing/object/ObjectManager.java
@@ -0,0 +1,60 @@
+package io.trygvis.esper.testing.object;
+
+import java.io.*;
+import java.util.*;
+
+public class ObjectManager<K, V extends Closeable> implements Closeable {
+ private final String type;
+ private final ObjectFactory<K, V> objectFactory;
+ private Map<K, V> objects = new HashMap<>();
+ private boolean closed = false;
+
+ public ObjectManager(String type, Set<K> initialKeys, ObjectFactory<K, V> objectFactory) {
+ this.type = type;
+ this.objectFactory = objectFactory;
+
+ update(initialKeys);
+ }
+
+ public synchronized void update(Collection<K> newKeys) {
+ if (closed) {
+ throw new RuntimeException("This instance is closed: type=" + type);
+ }
+ Set<K> found = new HashSet<>(newKeys);
+ found.removeAll(objects.keySet());
+
+ Set<K> gone = new HashSet<>(objects.keySet());
+ gone.removeAll(newKeys);
+
+ for (K k : gone) {
+ try {
+ System.out.println("Removing " + type + " with id=" + k);
+ objects.remove(k).close();
+ } catch (IOException e) {
+ e.printStackTrace(System.out);
+ }
+ }
+
+ for (K k : found) {
+ System.out.println("Adding " + type + " with id=" + k);
+ objects.put(k, objectFactory.create(k));
+ }
+ }
+
+ public synchronized void close() throws IOException {
+ if (closed) {
+ System.out.println("Already closed: type=" + type);
+ return;
+ }
+ update(Collections.<K>emptyList());
+ closed = true;
+ }
+
+ public synchronized Collection<V> getObjects() {
+ return new ArrayList<>(objects.values());
+ }
+
+ public void setObjects(Map<K, V> objects) {
+ this.objects = objects;
+ }
+}