/* * Copyright (c) 2011 Tony Garnock-Jones. All rights reserved. */ package hop; import java.lang.ref.WeakReference; import java.util.Hashtable; import java.util.Map; import java.util.UUID; /** */ public class NodeContainer { public String _name; public Map> _directory; public NodeContainer() { this(UUID.randomUUID().toString()); } public NodeContainer(String name) { _name = name; _directory = new Hashtable>(); } public String getName() { return _name; } public synchronized boolean bind(String name, Node n) { if (_directory.containsKey(name)) return false; _directory.put(name, new WeakReference(n)); return true; } public synchronized boolean unbind(String name) { if (!_directory.containsKey(name)) return false; _directory.remove(name); return true; } public synchronized void unbindReferencesTo(Node n) { for (Map.Entry> e : _directory.entrySet()) { if (e.getValue().get() == n) { _directory.remove(e.getKey()); } } } public synchronized Node lookup(String name) { WeakReference r = _directory.get(name); return (r == null) ? null : r.get(); } public boolean post(String sink, Object name, Object message, Object token) { return send(sink, SexpMessage.post(name, message, token)); } public boolean send(String name, Object message) { Node n = lookup(name); if (n == null) { System.err.println("Warning: sending to nonexistent node " + name + "; message " + message); return false; } n.handle(message); return true; } }