// ------------------------------------------------------------
 public void removeModule(Address addr) {
   Enumeration e = virtual.keys();
   Address key = addr;
   while (e.hasMoreElements()) {
     Address k = (Address) e.nextElement();
     if (k.equals(addr)) {
       virtual.remove(key);
       layer.shutdown(addr);
       layer.removeInterface(addr);
       return;
     }
   }
 }
 // ------------------------------------------------------------
 private void distributeExternal(Message mess) {
   Address target = mess.getHeader().getDestinationAddress();
   if (matchesExternal(target)) {
     log("Send to external MBus too\n\n");
     layer.send(mess);
   }
 }
  /**
   * Returns a list of entities that are currently on the MBus.
   *
   * @return Addresses of the entites
   */
  public Address[] getKnownEntities() {
    Address[] ext = layer.getKnownEntities();
    Address[] ret = new Address[ext.length + virtual.size()];
    int i = 0;
    for (i = 0; i < ext.length; i++) ret[i] = ext[i];
    Enumeration e = virtual.elements();
    while (e.hasMoreElements()) ret[i++] = ((MessageBus) e.nextElement()).getAddress();

    return ret;
  }
  // ------------------------------------------------------------
  public void addModule(VirtualMBusListener mod, Address addr) {
    Enumeration e = virtual.keys();
    Address key = addr;
    while (e.hasMoreElements()) {
      Address k = (Address) e.nextElement();
      if (k.equals(addr)) {
        key = k;
        break;
      }
    }

    // Add module to listeners
    virtual.put(key, mod);
    layer.addInterface(addr);
  }
  // ------------------------------------------------------------
  public VirtualTransportLayer(boolean spy) throws MBusException {
    ackQueue = new Hashtable();
    virtual = new Hashtable();
    external = new Vector();
    spyable = spy;

    // Create broadcast-address
    String[][] voidArray = {};
    allTargets = new Address(voidArray);

    layer = new SimpleTransportLayer(new Address[0], this);
    // Register the elements that are known by now
    Address[] tmp = layer.getKnownEntities();
    for (int i = 0; i < tmp.length; i++) external.addElement(tmp[i]);
  }
 // ------------------------------------------------------------
 public MBusConfiguration getConfig() {
   return layer.getConfig();
 }
 /**
  * Tell all entities that a single entity leaves the MBus.
  *
  * @param addr Address of the entity that leaves
  */
 public void close() {
   Enumeration e = virtual.keys();
   while (e.hasMoreElements()) removeModule((Address) e.nextElement());
   layer.close();
 }